Compare commits
386 Commits
38507a9be2
...
a5ecc34cae
Author | SHA1 | Date |
---|---|---|
Michele Guerini Rocco | a5ecc34cae | |
Michele Guerini Rocco | 607a2bf9ec | |
Michele Guerini Rocco | 144ce3dd81 | |
Michele Guerini Rocco | 588ab67320 | |
Michele Guerini Rocco | da519d0822 | |
Michele Guerini Rocco | 595b480002 | |
Michele Guerini Rocco | d9c8f67f99 | |
Michele Guerini Rocco | f978a3287c | |
Michele Guerini Rocco | b87c2c71c2 | |
Michele Guerini Rocco | 4e6f736f13 | |
Nicolas Werner | d27e42dec6 | |
Nicolas Werner | 17ad97c517 | |
Nicolas Werner | 011c3ac8ec | |
Nicolas Werner | 7284b20643 | |
Nicolas Werner | 0e5b367a3c | |
Nicolas Werner | b52527b4ca | |
Nicolas Werner | d9dd4a3934 | |
Nicolas Werner | ac4c9e024e | |
Nicolas Werner | a1c4889339 | |
Nicolas Werner | ae7bb333a1 | |
Nicolas Werner | 7833566cdb | |
Nicolas Werner | e9f4298418 | |
Nicolas Werner | 920409e914 | |
Nicolas Werner | 20740c9976 | |
Nicolas Werner | 05727b8a45 | |
DeepBlueV7.X | 2a380eeae6 | |
Vitaly Zaitsev | 1831819e67 | |
Nicolas Werner | 5457d67c98 | |
Nicolas Werner | 60606133cb | |
DeepBlueV7.X | 59b5df479e | |
Weblate | 0e64ccca02 | |
Vitaly Zaitsev | c432cf4909 | |
Nicolas Werner | 2f23a7d86f | |
Nicolas Werner | 58f5ba5023 | |
Alexander Bantyev | ac19c6c92b | |
DeepBlueV7.X | 316eb07dbf | |
Weblate | bbaa4b58d0 | |
Nicolas Werner | c0fa7330a2 | |
Loren Burkholder | 9297035ba8 | |
DeepBlueV7.X | 009d1a8e2d | |
Loren Burkholder | 92d9539824 | |
DeepBlueV7.X | 2a28b3a343 | |
Weblate | b7b9b00c7f | |
Loren Burkholder | 905b127a73 | |
Loren Burkholder | 787febdca2 | |
Loren Burkholder | 1f8777178e | |
Loren Burkholder | 707af2c11d | |
Loren Burkholder | 902d4a7eb2 | |
Weblate | ec9eb812f5 | |
Weblate | e56c020f84 | |
Weblate | 8e0db5e10e | |
Weblate | 718965fa9b | |
DeepBlueV7.X | dedc3cb1f8 | |
Nicolas Werner | b2175d044f | |
Weblate | 0c8c1c24f0 | |
Weblate | 74fe6d006c | |
Weblate | 57c418d7e5 | |
Weblate | 5756cf299e | |
Weblate | e9ed96d522 | |
Nicolas Werner | 3dc1802130 | |
phyto | 4481b2518b | |
Thulinma | 7ffae002a5 | |
Weblate | 5483c35452 | |
Weblate | 17127a08ac | |
Weblate | e16048fc10 | |
Weblate | 1cac7fed0b | |
Weblate | 160f740fbc | |
Nicolas Werner | a0fe13127d | |
Nicolas Werner | 36e5ef1a1f | |
Joseph Donofry | 720e7fceec | |
Nicolas Werner | fc7937c73d | |
Nicolas Werner | 50f5fc6637 | |
Nicolas Werner | ad4ea02547 | |
Nicolas Werner | 0ab566dc4b | |
Nicolas Werner | a320fc6f7a | |
DeepBlueV7.X | 539db70fd5 | |
DeepBlueV7.X | 17331fcf83 | |
Lukas Mai | b9517e588b | |
Nicolas Werner | 7734c4735a | |
ShootingStarDragons | 0e2cc65548 | |
Nicolas Werner | 673ca9d6a3 | |
tastytea | 1b00696bcc | |
Nicolas Werner | ee5b33978a | |
DeepBlueV7.X | 8c06460e91 | |
q234rty | fa3ea18dcd | |
Nicolas Werner | 0c3d46795b | |
Nicolas Werner | 9f529075f0 | |
Malte E | 5ed3bfc8f8 | |
ShootingStarDragons | 919ec2a5e3 | |
DeepBlueV7.X | 3abb49c4a2 | |
Nicolas Werner | 872b00807f | |
Nicolas Werner | ec3ba352c0 | |
ShootingStarDragons | e84e2b0aaa | |
Nicolas Werner | 47e3257963 | |
Nicolas Werner | 60b1a595e1 | |
Weblate | 7c8bb14f22 | |
Weblate | 13163699bc | |
Weblate | 0e4c0c4949 | |
Weblate | 181ea3850e | |
Weblate | edba6ad91f | |
Nicolas Werner | 213bcf0de6 | |
ShootingStarDragons | c893dfd102 | |
Weblate | 68bf9c0bfa | |
DeepBlueV7.X | f6b976b415 | |
Joseph Donofry | d511814caf | |
enigma9o7 | 3f846fbdba | |
ShootingStarDragons | 7d95ac23ce | |
DeepBlueV7.X | d59f0768f0 | |
tastytea | b17cc41645 | |
Nicolas Werner | 15d7a2f021 | |
Nicolas Werner | 1d8fc18304 | |
Jason Volk | 0253aa59c7 | |
Nicolas Werner | 7f9af9016d | |
DeepBlueV7.X | 2157ebb614 | |
Nicolas Werner | 47da48f6f2 | |
Nicolas Werner | 4c34f4bfee | |
ShootingStarDragons | abe4f8eb3c | |
Weblate | b4c0581948 | |
Weblate | b1439ac8ae | |
Weblate | 24f09ed426 | |
Nicolas Werner | c98231bac1 | |
Nicolas Werner | 33e9c80c1b | |
Nicolas Werner | bbb551f222 | |
enigma9o7 | 4f7bb8fa8c | |
Joseph Donofry | 05bfc2893f | |
tastytea | 02b900f86b | |
Joseph Donofry | c13a9d3b16 | |
squid-f | e6f87882f3 | |
Weblate | cec9584f80 | |
Weblate | d45a084ffb | |
Joseph Donofry | 8835040db6 | |
Weblate | e25fd5f4fc | |
Weblate | 05e06f84ec | |
Weblate | 698030be62 | |
Nicolas Werner | c32081727a | |
Nicolas Werner | aff6ee3844 | |
Nicolas Werner | ba56c9f408 | |
Nicolas Werner | 3507698ea5 | |
Nicolas Werner | 0c6a2fb706 | |
Weblate | c38c4b47c8 | |
Nicolas Werner | 239cfd6735 | |
Nicolas Werner | 9b8eb0a412 | |
Nicolas Werner | 9877ba525d | |
Nicolas Werner | 2345faf630 | |
Nicolas Werner | d6c7a2e0ce | |
Weblate | 067fb67a8e | |
Nicolas Werner | 8a619d2fea | |
Nicolas Werner | 0833b39781 | |
Joseph Donofry | a90b46026b | |
NullPointerException | 2382c17b67 | |
Linerly | ba0c489264 | |
Terry Cukerberg | 2b3685a2e6 | |
Daimar Stein | 4c3a999aca | |
zerowhy | 3af285a221 | |
Tirifto | d4e7528ccf | |
Priit Jõerüüt | 6c3af648d2 | |
Lurkki14 | a9c0ba08df | |
Chen Shaoju | fa69c1a901 | |
Poesty Li | d1d67734d7 | |
ling | 316ba0a886 | |
SOT-TECH | d8bce6d3e4 | |
Przemysław Romanik | ee68e967d9 | |
Jaron Viëtor | 537892981d | |
Nicolas Werner | 2ca5f87cdf | |
Nicolas Werner | 22495cd86a | |
Nicolas Werner | c5edd21e6b | |
Nicolas Werner | 008f71cdbd | |
Nicolas Werner | 6d8dabf623 | |
Nicolas Werner | b84bc7895e | |
Nicolas Werner | 1d4b5e40a3 | |
Nicolas Werner | 0b8709a0ea | |
Nicolas Werner | fd949f0b83 | |
Nicolas Werner | 82e5fa1b45 | |
Nicolas Werner | 7f6c1136ff | |
Nicolas Werner | b2ccf766ba | |
Nicolas Werner | f3b7919a53 | |
DeepBlueV7.X | 8b6109815d | |
DeepBlueV7.X | 82376877af | |
Zhymabek Roman | 5ba74a5d90 | |
Zhymabek Roman | f7749d9f97 | |
Zhymabek Roman | a823dacfb5 | |
Zhymabek Roman | c91694c6b2 | |
Zhymabek Roman | 10e2426090 | |
Nicolas Werner | 06723a4736 | |
Nicolas Werner | 77d2e31ace | |
Zhymabek Roman | 59410a99ac | |
Nicolas Werner | 3a6a905429 | |
Nicolas Werner | 5f315d8a3c | |
Nicolas Werner | 6176ce7c2b | |
Nicolas Werner | 34203b5349 | |
Joseph Donofry | 69c11d4533 | |
Nicolas Werner | 114fa0868a | |
Weblate | 35673b5b52 | |
Nicolas Werner | 79a2efd25a | |
Nicolas Werner | 9dfe2248d5 | |
Nicolas Werner | 5bf315687a | |
Nicolas Werner | 2577c93bb6 | |
Nicolas Werner | 01915360b4 | |
Nicolas Werner | 6529240be8 | |
Nicolas Werner | f98b289ba2 | |
Joseph Donofry | c0b7963134 | |
Weblate | d78187b405 | |
Joseph Donofry | cc89a36f46 | |
Joseph Donofry | a2e120a8a3 | |
Nicolas Werner | d4336b56d6 | |
Nicolas Werner | 0597041d8e | |
Nicolas Werner | b314f41f6b | |
Nicolas Werner | 51cbe0f6d8 | |
Nicolas Werner | 561085ef9d | |
Nicolas Werner | 2a4eac04b9 | |
Nicolas Werner | 2ac3be1a18 | |
Nicolas Werner | e8e475956b | |
Nicolas Werner | 1a9f7860d4 | |
Nicolas Werner | 0d0c6187c0 | |
Nicolas Werner | 6762032c53 | |
Nicolas Werner | eefa6379f9 | |
Nicolas Werner | 8730586cfd | |
Nicolas Werner | 593d08fd2e | |
Nicolas Werner | 8356746ea4 | |
Nicolas Werner | 95d898e09d | |
Nicolas Werner | 952827d629 | |
Nicolas Werner | 0035c359ce | |
Loren Burkholder | fa0c14b846 | |
Weblate | c2eb2f7ad1 | |
Nicolas Werner | 40a7d58ce1 | |
Nicolas Werner | 283d6361e8 | |
DeepBlueV7.X | 575294971d | |
q234rty | 93291abfdf | |
q234rty | 4b8709598b | |
Nicolas Werner | 59703d3c25 | |
Weblate | ea5984a575 | |
Nicolas Werner | f440b41195 | |
Nicolas Werner | 329b4310b3 | |
Nicolas Werner | 5b929c9d1a | |
Weblate | 30bbfeaea6 | |
Weblate | 5f554aa5cc | |
Joseph Donofry | 802ba78fea | |
Nicolas Werner | ed889c32fc | |
Nicolas Werner | 3576589ea7 | |
Nicolas Werner | 485babba14 | |
DeepBlueV7.X | 0cc1c6eddc | |
Loren Burkholder | fe02e0dd91 | |
Nicolas Werner | 725b5e0383 | |
Nicolas Werner | 537fa437e2 | |
Nicolas Werner | 1f77e1c810 | |
DeepBlueV7.X | eb4994ea87 | |
Loren Burkholder | b622604c47 | |
DeepBlueV7.X | a81aaa182a | |
Loren Burkholder | de3cdd590f | |
DeepBlueV7.X | 314785d05c | |
LordMZTE | 9a15b0ea20 | |
LordMZTE | 80270e1f01 | |
Joe Donofry | a6f53699f5 | |
Joe Donofry | 07e8f64903 | |
Nicolas Werner | 76347f1c6f | |
Nicolas Werner | 56a4e97296 | |
Nicolas Werner | 0ae29d8bfc | |
Nicolas Werner | 40ac55ddd9 | |
Nicolas Werner | 231bebba44 | |
Nicolas Werner | 54931cb21b | |
Nicolas Werner | 676a6506cb | |
Nicolas Werner | ee1a219661 | |
Weblate | 53bbfefbab | |
Nicolas Werner | 9138119dc4 | |
Joseph Donofry | b92a3b8df5 | |
Nicolas Werner | d8669ccf3d | |
Joseph Donofry | 7f825e3ee8 | |
Joseph Donofry | c6c8ac092b | |
Joe Donofry | 1d477dfc65 | |
Joe Donofry | 35b18700ac | |
Nicolas Werner | 48ecc2b45a | |
Nicolas Werner | ac0f011221 | |
Nicolas Werner | 9a90f8868f | |
Nicolas Werner | b28fa86e6a | |
DeepBlueV7.X | 5be8298d0a | |
Weblate | 3109508e85 | |
foxb612 | f3ecef5cd7 | |
Zhymabek Roman | eb845b2290 | |
Nicolas Werner | ccd2465066 | |
Zhymabek Roman | 7cd45c16fd | |
Nicolas Werner | e9a0f0a89e | |
Zhymabek Roman | 4636211b90 | |
Zhymabek Roman | ef0ef4dbb2 | |
Zhymabek Roman | 7747469825 | |
Zhymabek Roman | 1f666acffc | |
Zhymabek Roman | 1ee37e026c | |
Nicolas Werner | 74128cf8bd | |
Nicolas Werner | 1423011dd9 | |
Rohit Sutradhar | ac48c33286 | |
Nicolas Werner | 8a4bb32b4a | |
Nicolas Werner | 37009906bb | |
Nicolas Werner | a1dd02d763 | |
Weblate | 03fc88281d | |
Weblate | e2ea5650a2 | |
Weblate | 32752df028 | |
Nicolas Werner | af699eb83e | |
Weblate | 00cc9a09a5 | |
Nicolas Werner | 4002b1ecf1 | |
Nicolas Werner | 30fde1f8ac | |
Nicolas Werner | 7e0ea12ebb | |
Nicolas Werner | a4524cd9af | |
Nicolas Werner | f2f9359f7f | |
Nicolas Werner | f1c1f18f81 | |
Nicolas Werner | 857d9cf2b6 | |
Weblate | a87f1be688 | |
Nicolas Werner | aed1440d26 | |
Nicolas Werner | d70a344a4d | |
Nicolas Werner | 005a4978bf | |
Nicolas Werner | b205819ba6 | |
Nicolas Werner | d8993c14e1 | |
Loren Burkholder | 8ecbb39dc6 | |
DeepBlueV7.X | 5e9eb845ab | |
Loren Burkholder | e7d0344997 | |
Nicolas Werner | 33403d650a | |
DeepBlueV7.X | cfcdc23d4a | |
Nicolas Werner | b3c5f41625 | |
Nicolas Werner | 1365e4e266 | |
Nicolas Werner | a55fc8e43b | |
Nicolas Werner | b55b5a8321 | |
Nicolas Werner | 09babc91d2 | |
Loren Burkholder | 2aef39fda8 | |
Nicolas Werner | 42a23e1859 | |
Nicolas Werner | 22a6b8ddb4 | |
Nicolas Werner | 944e369d50 | |
DeepBlueV7.X | f8724fdea8 | |
Nicolas Werner | b2b2932c98 | |
Nicolas Werner | 7ec842ba51 | |
Nicolas Werner | 30882d4aa9 | |
Michele Guerini Rocco | f5d5bea840 | |
Nicolas Werner | 2a7c6f2d86 | |
Nicolas Werner | 570d7b8b30 | |
Loren Burkholder | 08aa383a62 | |
Loren Burkholder | df834ffc48 | |
Loren Burkholder | e78d107558 | |
Nicolas Werner | 78784babd1 | |
Nicolas Werner | 1ea5449c18 | |
Nicolas Werner | c34c9f9035 | |
Nicolas Werner | 88cbac1695 | |
Nicolas Werner | bffa0115d4 | |
Nicolas Werner | 2fde381a82 | |
Nicolas Werner | 051c25d5b8 | |
Nicolas Werner | 0752f9477e | |
Joseph Donofry | d103f793bf | |
Joseph Donofry | d7fffa9f46 | |
Joseph Donofry | e5d0244ef9 | |
Nicolas Werner | 851333a50d | |
Joseph Donofry | 951d0f4d23 | |
Joseph Donofry | 7b0ef054d0 | |
Joseph Donofry | ae442f3b45 | |
Joseph Donofry | 8ac87a5fbe | |
Joseph Donofry | cbdcde9572 | |
Joseph Donofry | 3c21e09caf | |
Nicolas Werner | 79ce60382a | |
Nicolas Werner | ce2d4defde | |
Nicolas Werner | 683fd75700 | |
Weblate | 3b99e3826e | |
Weblate | aad97cffef | |
Nicolas Werner | ed15d73d36 | |
Nicolas Werner | 33d45d5765 | |
Nicolas Werner | a8e35e5623 | |
Nicolas Werner | efb9970178 | |
Weblate | 7efb4a22c7 | |
DeepBlueV7.X | ed880248c8 | |
Weblate | a079e370ff | |
Weblate | c4cb0b2c86 | |
Weblate | 7562b03b8e | |
Nicolas Werner | b629455fab | |
Nicolas Werner | 421b15c05c | |
Marcus | 56d2a0d39d | |
DeepBlueV7.X | 7088c9bd9b | |
Marcus | e46fd37dec | |
Nicolas Werner | fc0baa86b0 | |
Nicolas Werner | fe403ddc70 | |
Jason Volk | 603b90a6f5 | |
DeepBlueV7.X | ef2ec6d3e7 | |
q234rty | 15b9dbe98d | |
Nicolas Werner | cd08a130c6 | |
DeepBlueV7.X | 0ebd0b0526 | |
Sebastian Spaeth | 0f544d2e45 | |
Weblate | 59eb09cf0f | |
Nicolas Werner | 9c3ca95683 | |
Hiers | 8071b192b8 | |
DeepBlueV7.X | 02adcfdc38 | |
Forest | 80f7683a57 | |
Nicolas Werner | 12da7bd08c | |
Nicolas Werner | 2bdb9c4347 |
|
@ -0,0 +1,32 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
set -u
|
||||
|
||||
# unused
|
||||
#TAG=$(git tag -l --points-at HEAD)
|
||||
|
||||
# Add Qt binaries to path
|
||||
PATH="$(brew --prefix qt5):${PATH}"
|
||||
export PATH
|
||||
|
||||
CMAKE_PREFIX_PATH="$(brew --prefix qt5)"
|
||||
export CMAKE_PREFIX_PATH
|
||||
|
||||
cmake -GNinja -S. -Bbuild \
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||
-DCMAKE_INSTALL_PREFIX=.deps/usr \
|
||||
-DHUNTER_ROOT="../.hunter" \
|
||||
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF \
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo -DHUNTER_CONFIGURATION_TYPES=RelWithDebInfo \
|
||||
-DUSE_BUNDLED_OPENSSL=ON \
|
||||
-DCI_BUILD=ON
|
||||
cmake --build build
|
||||
( cd build || exit
|
||||
git clone https://github.com/Nheko-Reborn/qt-jdenticon.git
|
||||
( cd qt-jdenticon || exit
|
||||
qmake
|
||||
make -j 4
|
||||
cp libqtjdenticon.dylib ../nheko.app/Contents/MacOS
|
||||
)
|
||||
"$(brew --prefix qt5)/bin/macdeployqt" nheko.app -always-overwrite -qmldir=../resources/qml/
|
||||
)
|
|
@ -1,34 +0,0 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
set -eux
|
||||
|
||||
# unused
|
||||
#TAG=$(git tag -l --points-at HEAD)
|
||||
|
||||
# Add Qt binaries to path
|
||||
PATH=/usr/local/opt/qt@5/bin/:${PATH}
|
||||
|
||||
( cd build
|
||||
# macdeployqt does not copy symlinks over.
|
||||
# this specifically addresses icu4c issues but nothing else.
|
||||
ICU_LIB="$(brew --prefix icu4c)/lib"
|
||||
export ICU_LIB
|
||||
mkdir -p nheko.app/Contents/Frameworks
|
||||
find "${ICU_LIB}" -type l -name "*.dylib" -exec cp -a -n {} nheko.app/Contents/Frameworks/ \; || true
|
||||
|
||||
macdeployqt nheko.app -dmg -always-overwrite -qmldir=../resources/qml/
|
||||
|
||||
user=$(id -nu)
|
||||
chown "${user}" nheko.dmg
|
||||
mv nheko.dmg ..
|
||||
)
|
||||
|
||||
dmgbuild -s ./.ci/macos/settings.json "Nheko" nheko.dmg
|
||||
|
||||
VERSION=${CI_COMMIT_SHORT_SHA}
|
||||
|
||||
if [ -n "$VERSION" ]; then
|
||||
mv nheko.dmg "nheko-${VERSION}.dmg"
|
||||
mkdir artifacts
|
||||
cp "nheko-${VERSION}.dmg" artifacts/
|
||||
fi
|
|
@ -7,24 +7,28 @@ set -u
|
|||
|
||||
# Add Qt binaries to path
|
||||
PATH="/usr/local/opt/qt@5/bin/:${PATH}"
|
||||
export PATH
|
||||
|
||||
security unlock-keychain -p "${RUNNER_USER_PW}" login.keychain
|
||||
|
||||
( cd build || exit
|
||||
# macdeployqt does not copy symlinks over.
|
||||
# this specifically addresses icu4c issues but nothing else.
|
||||
# We might not even need this any longer...
|
||||
# ICU_LIB="$(brew --prefix icu4c)/lib"
|
||||
# export ICU_LIB
|
||||
# mkdir -p nheko.app/Contents/Frameworks
|
||||
# find "${ICU_LIB}" -type l -name "*.dylib" -exec cp -a -n {} nheko.app/Contents/Frameworks/ \; || true
|
||||
if [ -n "${CI_PIPELINE_TRIGGERED:-}" ] && [ "${TRIGGERED_BY:-}" = "cirrus" ]; then
|
||||
echo "cirrus build id: ${TRIGGER_BUILD_ID}"
|
||||
cat "${TRIGGER_PAYLOAD}"
|
||||
# download the build artifacts from cirrus api
|
||||
curl "https://api.cirrus-ci.com/v1/artifact/build/${TRIGGER_BUILD_ID}/binaries.zip" -o binaries.zip
|
||||
# cirrus ci artifacts task name is 'binaries' so that's the zip name.
|
||||
unzip binaries.zip
|
||||
# we zip 'build/nheko.app' in cirrus ci, cirrus itself puts it in a 'build' directory
|
||||
# so move it to the right place for the rest of the process.
|
||||
( cd build || exit
|
||||
unzip nheko.zip
|
||||
)
|
||||
fi
|
||||
|
||||
#macdeployqt nheko.app -dmg -always-overwrite -qmldir=../resources/qml/ -sign-for-notarization="${APPLE_DEV_IDENTITY}"
|
||||
macdeployqt nheko.app -always-overwrite -qmldir=../resources/qml/
|
||||
|
||||
# user=$(id -nu)
|
||||
# chown "${user}" nheko.dmg
|
||||
)
|
||||
if [ ! -d "build/nheko.app" ]; then
|
||||
echo "nheko.app is missing, you did something wrong!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "[INFO] Signing app contents"
|
||||
find "build/nheko.app/Contents"|while read -r fname; do
|
||||
|
@ -46,6 +50,7 @@ trap finish EXIT
|
|||
|
||||
dmgbuild -s .ci/macos/settings.json "Nheko" nheko.dmg
|
||||
codesign -s "${APPLE_DEV_IDENTITY}" nheko.dmg
|
||||
|
||||
user=$(id -nu)
|
||||
chown "${user}" nheko.dmg
|
||||
|
||||
|
@ -72,7 +77,7 @@ while sleep 60 && date; do
|
|||
#isSuccess=$(grep "success" "$NOTARIZE_STATUS_LOG")
|
||||
#isFailure=$(grep "invalid" "$NOTARIZE_STATUS_LOG")
|
||||
|
||||
echo "Status for submission \"${requestUUID}\": \"${sub_status}\""
|
||||
echo "Status for submission \"${requestUUID}\": \"${sub_status}\""
|
||||
|
||||
if [ "${sub_status}" = "Accepted" ]; then
|
||||
echo "Notarization done!"
|
||||
|
@ -82,6 +87,7 @@ while sleep 60 && date; do
|
|||
fi
|
||||
if [ "${sub_status}" = "Invalid" ] || [ "${sub_status}" = "Rejected" ]; then
|
||||
echo "Notarization failed"
|
||||
xcrun notarytool log "${requestUUID}" --apple-id "${APPLE_DEV_USER}" --password "${APPLE_DEV_PASS}" --team-id "${APPLE_TEAM_ID}" > "$NOTARIZE_STATUS_LOG" 2>&1
|
||||
cat "$NOTARIZE_STATUS_LOG" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
@ -91,7 +97,7 @@ done
|
|||
VERSION=${CI_COMMIT_SHORT_SHA}
|
||||
|
||||
if [ -n "$VERSION" ]; then
|
||||
mv nheko.dmg "nheko-${VERSION}.dmg"
|
||||
mv nheko.dmg "nheko-${VERSION}_${PLAT}.dmg"
|
||||
mkdir artifacts
|
||||
cp "nheko-${VERSION}.dmg" artifacts/
|
||||
cp "nheko-${VERSION}_${PLAT}.dmg" artifacts/
|
||||
fi
|
|
@ -0,0 +1,24 @@
|
|||
task:
|
||||
macos_instance:
|
||||
image: ghcr.io/cirruslabs/macos-monterey-xcode:13
|
||||
name: Build - macOS Apple Silicon
|
||||
only_if: $CIRRUS_REPO_OWNER == 'Nheko-Reborn'
|
||||
environment:
|
||||
GITLAB_TRIGGER_TOKEN: ENCRYPTED[!5fb4bbdecbde3b2c766ac7383dca573cd5ec8b815c5ac9bede0cadfe9ad70ecd3e64b1728f7840da087099f3fc1fd4f7!]
|
||||
homebrew_script:
|
||||
- brew bundle --file .ci/macos/Brewfile
|
||||
build_script:
|
||||
- export PATH="$(brew --prefix qt5)/bin/:${PATH}"
|
||||
- ./.ci/macos/build.sh
|
||||
zip_script:
|
||||
- ditto -c -k --sequesterRsrc --keepParent build/nheko.app build/nheko.zip
|
||||
gitlab_script:
|
||||
- curl -X POST
|
||||
--fail
|
||||
-F token="${GITLAB_TRIGGER_TOKEN}"
|
||||
-F ref="${CIRRUS_BRANCH}"
|
||||
-F "variables[TRIGGER_BUILD_ID]=${CIRRUS_BUILD_ID}"
|
||||
-F "variables[TRIGGERED_BY]=cirrus"
|
||||
"https://nheko.im/api/v4/projects/2/trigger/pipeline"
|
||||
binaries_artifacts:
|
||||
path: build/nheko.zip
|
|
@ -13,3 +13,6 @@ KeepEmptyLinesAtTheStartOfBlocks: false
|
|||
PointerAlignment: Right
|
||||
Cpp11BracedListStyle: true
|
||||
PenaltyReturnTypeOnItsOwnLine: 0
|
||||
---
|
||||
BasedOnStyle: WebKit
|
||||
Language: ObjC
|
196
.gitlab-ci.yml
|
@ -13,11 +13,11 @@ build-clazy:
|
|||
TRAVIS_OS_NAME: linux
|
||||
before_script:
|
||||
- apt-get update
|
||||
- apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake liblmdb-dev
|
||||
libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev
|
||||
qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev
|
||||
qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform
|
||||
qt5keychain-dev ccache clazy libcurl4-openssl-dev libevent-dev libspdlog-dev git nlohmann-json3-dev libcmark-dev asciidoc # libolm-dev
|
||||
- apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake liblmdb-dev libre2-dev
|
||||
libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev
|
||||
qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev
|
||||
qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform
|
||||
qt5keychain-dev ccache clazy libcurl4-openssl-dev libevent-dev libspdlog-dev git nlohmann-json3-dev libcmark-dev asciidoc # libolm-dev
|
||||
script:
|
||||
- export PATH="/usr/local/bin/:/usr/lib/ccache:${PATH}"
|
||||
- export CMAKE_BUILD_PARALLEL_LEVEL=$(cat /proc/cpuinfo | awk '/^processor/{print $3}' | wc -l)
|
||||
|
@ -28,37 +28,36 @@ build-clazy:
|
|||
-DCMAKE_BUILD_TYPE=Release
|
||||
-DCI_BUILD=ON -DFETCHCONTENT_QUIET=OFF -DCMAKE_CXX_COMPILER=clazy
|
||||
- cmake --build build
|
||||
rules:
|
||||
- if : '$CI_PIPELINE_TRIGGERED == null'
|
||||
cache:
|
||||
key: "$CI_JOB_NAME"
|
||||
paths:
|
||||
- .ccache
|
||||
|
||||
build-gcc9:
|
||||
build-gcc11:
|
||||
stage: build
|
||||
image: ubuntu:20.04
|
||||
image: ubuntu:22.04
|
||||
tags: [docker]
|
||||
variables:
|
||||
QT_PKG: 515
|
||||
TRAVIS_OS_NAME: linux
|
||||
before_script:
|
||||
- apt-get update
|
||||
- apt-get install -y software-properties-common
|
||||
- add-apt-repository ppa:ubuntu-toolchain-r/test -y
|
||||
- add-apt-repository ppa:beineri/opt-qt-5.15.2-focal -y
|
||||
- apt-get update && apt-get -y install --no-install-recommends build-essential ninja-build qt${QT_PKG}{base,declarative,tools,multimedia,script,quickcontrols2,svg} liblmdb-dev libgl1-mesa-dev libssl-dev git ccache pkg-config libsecret-1-dev cmake asciidoc xsltproc
|
||||
- apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake ccache liblmdb-dev
|
||||
libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev
|
||||
qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev
|
||||
qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform
|
||||
qt5keychain-dev ccache clazy libcurl4-openssl-dev libevent-dev libspdlog-dev git nlohmann-json3-dev libcmark-dev asciidoc # libolm-dev
|
||||
# need recommended deps for wget
|
||||
- apt-get -y install wget
|
||||
- /usr/sbin/update-ccache-symlinks
|
||||
- wget https://github.com/Kitware/CMake/releases/download/v3.19.0/cmake-3.19.0-Linux-x86_64.sh && sh cmake-3.19.0-Linux-x86_64.sh --skip-license --prefix=/usr/local
|
||||
- rm -rf ../.hunter && mv .hunter ../.hunter || true
|
||||
script:
|
||||
- export PATH="/usr/local/bin/:/usr/lib/ccache:${PATH}"
|
||||
- export CMAKE_BUILD_PARALLEL_LEVEL=$(cat /proc/cpuinfo | awk '/^processor/{print $3}' | wc -l)
|
||||
- . "/opt/qt${QT_PKG}/bin/qt${QT_PKG}-env.sh" || true
|
||||
- export PATH="/usr/lib/ccache:${PATH}"
|
||||
- cmake -GNinja -H. -Bbuild
|
||||
-DCMAKE_INSTALL_PREFIX=.deps/usr
|
||||
-DHUNTER_ROOT="../.hunter"
|
||||
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF -DUSE_BUNDLED_OPENSSL=ON -DUSE_BUNDLED_LMDB=OFF
|
||||
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF -DUSE_BUNDLED_OPENSSL=ON -DUSE_BUNDLED_LMDB=OFF -DUSE_BUNDLED_QTKEYCHAIN=OFF
|
||||
-DVOIP=OFF
|
||||
-DCMAKE_BUILD_TYPE=Release -DHUNTER_CONFIGURATION_TYPES=Release
|
||||
-DCI_BUILD=ON -DFETCHCONTENT_QUIET=OFF
|
||||
|
@ -66,6 +65,47 @@ build-gcc9:
|
|||
- cmake --build build
|
||||
after_script:
|
||||
- mv ../.hunter .hunter
|
||||
rules:
|
||||
- if : '$CI_PIPELINE_TRIGGERED == null'
|
||||
cache:
|
||||
key: "$CI_JOB_NAME"
|
||||
paths:
|
||||
- .hunter/
|
||||
- .ccache
|
||||
|
||||
build-gcc10:
|
||||
stage: build
|
||||
image: debian:bullseye
|
||||
tags: [docker]
|
||||
variables:
|
||||
TRAVIS_OS_NAME: linux
|
||||
before_script:
|
||||
- apt-get update
|
||||
- apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake ccache liblmdb-dev
|
||||
libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev
|
||||
qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev
|
||||
qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform
|
||||
qt5keychain-dev ccache clazy libcurl4-openssl-dev libevent-dev libspdlog-dev git nlohmann-json3-dev libcmark-dev asciidoc # libolm-dev
|
||||
# need recommended deps for wget
|
||||
- apt-get -y install wget
|
||||
- /usr/sbin/update-ccache-symlinks
|
||||
- rm -rf ../.hunter && mv .hunter ../.hunter || true
|
||||
script:
|
||||
- export PATH="/usr/lib/ccache:${PATH}"
|
||||
- cmake -GNinja -H. -Bbuild
|
||||
-DCMAKE_INSTALL_PREFIX=.deps/usr
|
||||
-DHUNTER_ROOT="../.hunter"
|
||||
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF -DUSE_BUNDLED_OPENSSL=ON -DUSE_BUNDLED_LMDB=OFF -DUSE_BUNDLED_QTKEYCHAIN=OFF
|
||||
-DVOIP=OFF
|
||||
-DCMAKE_BUILD_TYPE=Release -DHUNTER_CONFIGURATION_TYPES=Release
|
||||
-DCI_BUILD=ON -DFETCHCONTENT_QUIET=OFF
|
||||
-DJSON_ImplicitConversions=OFF
|
||||
-DMAN=OFF
|
||||
- cmake --build build
|
||||
after_script:
|
||||
- mv ../.hunter .hunter
|
||||
rules:
|
||||
- if : '$CI_PIPELINE_TRIGGERED == null'
|
||||
cache:
|
||||
key: "$CI_JOB_NAME"
|
||||
paths:
|
||||
|
@ -78,21 +118,11 @@ build-macos:
|
|||
before_script:
|
||||
- rm -rf ../.hunter && mv .hunter ../.hunter || true
|
||||
script:
|
||||
- export PATH=/usr/local/opt/qt@5/bin/:${PATH}
|
||||
- export CMAKE_PREFIX_PATH=/usr/local/opt/qt@5
|
||||
- cmake -GNinja -H. -Bbuild
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
-DCMAKE_INSTALL_PREFIX=.deps/usr
|
||||
-DHUNTER_ROOT="../.hunter"
|
||||
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo -DHUNTER_CONFIGURATION_TYPES=RelWithDebInfo
|
||||
-DUSE_BUNDLED_OPENSSL=ON
|
||||
-DUSE_BUNDLED_BOOST=ON
|
||||
-DCI_BUILD=ON
|
||||
- cmake --build build
|
||||
- (cd build && git clone https://github.com/Nheko-Reborn/qt-jdenticon.git && cd qt-jdenticon && qmake && make -j 4 && cp libqtjdenticon.dylib ../nheko.app/Contents/MacOS)
|
||||
- ./.ci/macos/build.sh
|
||||
after_script:
|
||||
- mv ../.hunter .hunter
|
||||
rules:
|
||||
- if : '$CI_PIPELINE_TRIGGERED == null'
|
||||
artifacts:
|
||||
paths:
|
||||
- build/nheko.app
|
||||
|
@ -108,22 +138,27 @@ build-macos:
|
|||
codesign-macos:
|
||||
stage: deploy
|
||||
tags: [macos]
|
||||
variables:
|
||||
PLAT: "intel"
|
||||
before_script:
|
||||
- 'brew upgrade qt@5'
|
||||
- pip3 install dmgbuild
|
||||
script:
|
||||
- export PATH=/usr/local/opt/qt@5/bin/:${PATH}
|
||||
- ./.ci/macos/notarize.sh
|
||||
after_script:
|
||||
- ./.ci/upload-nightly-gitlab.sh artifacts/nheko-${CI_COMMIT_SHORT_SHA}.dmg
|
||||
- ./.ci/upload-nightly-gitlab.sh artifacts/nheko-${CI_COMMIT_SHORT_SHA}_${PLAT}.dmg
|
||||
needs:
|
||||
- build-macos
|
||||
- job: build-macos
|
||||
optional: true # optional since we want to be able to also trigger this job from cirrus ci for apple silicon builds.
|
||||
rules:
|
||||
- if: '$CI_COMMIT_BRANCH == "master"'
|
||||
- if : '$CI_PIPELINE_TRIGGERED && $CI_COMMIT_REF_PROTECTED == "true"'
|
||||
variables:
|
||||
PLAT: "m1"
|
||||
- if : '$CI_COMMIT_BRANCH == "master"'
|
||||
- if : $CI_COMMIT_TAG
|
||||
artifacts:
|
||||
paths:
|
||||
- artifacts/nheko-${CI_COMMIT_SHORT_SHA}.dmg
|
||||
- artifacts/nheko-${CI_COMMIT_SHORT_SHA}_${PLAT}.dmg
|
||||
- /tmp/notarize*
|
||||
name: nheko-${CI_COMMIT_SHORT_SHA}-macos
|
||||
|
||||
|
@ -135,17 +170,19 @@ build-flatpak-amd64:
|
|||
before_script:
|
||||
- apt-get update && apt-get -y install flatpak-builder git python3 curl python3-aiohttp python3-tenacity gir1.2-ostree-1.0
|
||||
- flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||
- flatpak --noninteractive install --user flathub org.kde.Platform//5.15-21.08
|
||||
- flatpak --noninteractive install --user flathub org.kde.Sdk//5.15-21.08
|
||||
# see https://github.com/flatpak/flatpak-builder/issues/495
|
||||
- git config --global protocol.file.allow always
|
||||
script:
|
||||
- export VERSION=$(git describe)
|
||||
- mkdir -p build-flatpak
|
||||
- cd build-flatpak
|
||||
- flatpak-builder --user --disable-rofiles-fuse --ccache --repo=repo --default-branch=${CI_COMMIT_REF_NAME//\//_} --subject="Build of Nheko ${VERSION} `date`" app ../io.github.NhekoReborn.Nheko.yaml
|
||||
- flatpak-builder --install-deps-from=flathub --user --disable-rofiles-fuse --ccache --repo=repo --default-branch=${CI_COMMIT_REF_NAME//\//_} --subject="Build of Nheko ${VERSION} `date`" app ../io.github.NhekoReborn.Nheko.yaml
|
||||
- flatpak build-bundle repo nheko-amd64.flatpak io.github.NhekoReborn.Nheko ${CI_COMMIT_REF_NAME//\//_}
|
||||
after_script:
|
||||
- (cd ./scripts && ./upload-to-flatpak-repo.sh ../build-flatpak/repo) || true
|
||||
- bash ./.ci/upload-nightly-gitlab.sh build-flatpak/nheko-amd64.flatpak
|
||||
- (cd ./scripts && ./upload-to-flatpak-repo.sh ../build-flatpak/repo) || true
|
||||
rules:
|
||||
- if : '$CI_PIPELINE_TRIGGERED == null'
|
||||
cache:
|
||||
key: "$CI_JOB_NAME"
|
||||
paths:
|
||||
|
@ -163,17 +200,20 @@ build-flatpak-arm64:
|
|||
before_script:
|
||||
- apt-get update && apt-get -y install flatpak-builder git python3 curl python3-aiohttp python3-tenacity gir1.2-ostree-1.0
|
||||
- flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||
- flatpak --noninteractive install --user flathub org.kde.Platform//5.15-21.08
|
||||
- flatpak --noninteractive install --user flathub org.kde.Sdk//5.15-21.08
|
||||
# see https://github.com/flatpak/flatpak-builder/issues/495
|
||||
- git config --global protocol.file.allow always
|
||||
script:
|
||||
- export VERSION=$(git describe)
|
||||
- if [ "$(grep MemTotal /proc/meminfo | tr -cd '[0-9]')" -lt "6000000" ]; then export EXTRA_FLAGS='--jobs=3'; fi
|
||||
- mkdir -p build-flatpak
|
||||
- cd build-flatpak
|
||||
- flatpak-builder --user --disable-rofiles-fuse --ccache --repo=repo --default-branch=${CI_COMMIT_REF_NAME//\//_} --subject="Build of Nheko ${VERSION} `date` for arm64" app ../io.github.NhekoReborn.Nheko.yaml
|
||||
- flatpak-builder --install-deps-from=flathub --user --disable-rofiles-fuse --ccache $EXTRA_FLAGS --repo=repo --default-branch=${CI_COMMIT_REF_NAME//\//_} --subject="Build of Nheko ${VERSION} `date` for arm64" app ../io.github.NhekoReborn.Nheko.yaml
|
||||
- flatpak build-bundle repo nheko-arm64.flatpak io.github.NhekoReborn.Nheko ${CI_COMMIT_REF_NAME//\//_}
|
||||
after_script:
|
||||
- (cd ./scripts && ./upload-to-flatpak-repo.sh ../build-flatpak/repo) || true
|
||||
- bash ./.ci/upload-nightly-gitlab.sh build-flatpak/nheko-arm64.flatpak
|
||||
- (cd ./scripts && ./upload-to-flatpak-repo.sh ../build-flatpak/repo) || true
|
||||
rules:
|
||||
- if : '$CI_PIPELINE_TRIGGERED == null'
|
||||
cache:
|
||||
key: "$CI_JOB_NAME"
|
||||
paths:
|
||||
|
@ -183,15 +223,83 @@ build-flatpak-arm64:
|
|||
paths: ['build-flatpak/nheko-arm64.flatpak']
|
||||
name: flatpak-${CI_COMMIT_REF_NAME}-${VERSION}-arm64
|
||||
|
||||
appimage-amd64:
|
||||
stage: build
|
||||
image: ubuntu:22.04
|
||||
tags: [docker]
|
||||
allow_failure: true
|
||||
before_script:
|
||||
# Installing the packages needed to download and install third-party tools
|
||||
- apt-get update && apt-get install -y software-properties-common git wget curl python3 python3-pip python3-setuptools
|
||||
|
||||
# Installing the packages needed to compile nheko and third-party tools
|
||||
- apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake ccache liblmdb-dev
|
||||
libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev
|
||||
qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev
|
||||
qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform
|
||||
qt5keychain-dev ccache clazy libcurl4-openssl-dev libevent-dev libspdlog-dev nlohmann-json3-dev libcmark-dev asciidoc libre2-dev libgtest-dev libgl1-mesa-dev qml-module-qtquick-particles2
|
||||
|
||||
# Installing the packages needed to build AppImage
|
||||
- apt-get -yq install breeze-icon-theme desktop-file-utils elfutils fakeroot file gnupg2 gtk-update-icon-cache libgdk-pixbuf2.0-dev libgdk-pixbuf2.0-0 libglib2.0-bin librsvg2-dev libyaml-dev strace zsync squashfs-tools
|
||||
|
||||
- wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O /usr/local/bin/appimagetool && \
|
||||
- chmod +x /usr/local/bin/appimagetool
|
||||
|
||||
- export HOME_DIR=$(pwd)
|
||||
|
||||
# Workaround for https://github.com/AppImageCrafters/appimage-builder/issues/280
|
||||
- cd /tmp
|
||||
- git clone https://github.com/AppImageCrafters/appimage-builder
|
||||
- cd appimage-builder
|
||||
- git checkout 9733877eed75aea0fa8e9a1cd26c22d77a10aa4a
|
||||
- pip3 install .
|
||||
- pip3 install cffi
|
||||
- cd $HOME_DIR
|
||||
|
||||
- /usr/sbin/update-ccache-symlinks
|
||||
- rm -rf ../.hunter && mv .hunter ../.hunter || true
|
||||
|
||||
script:
|
||||
- export PATH="/usr/local/bin/:/usr/lib/ccache:${PATH}"
|
||||
- cmake -GNinja -H. -Bbuild
|
||||
-DCMAKE_INSTALL_PREFIX=/usr
|
||||
-DHUNTER_ROOT=".hunter"
|
||||
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF -DUSE_BUNDLED_OPENSSL=ON -DUSE_BUNDLED_LMDB=OFF -DUSE_BUNDLED_QTKEYCHAIN=OFF -DUSE_BUNDLED_LIBEVENT=OFF
|
||||
-DVOIP=OFF -DMAN=OFF
|
||||
-DCMAKE_BUILD_TYPE=Release -DHUNTER_CONFIGURATION_TYPES=Release
|
||||
-DCI_BUILD=ON -DFETCHCONTENT_QUIET=OFF
|
||||
-DJSON_ImplicitConversions=OFF
|
||||
- DESTDIR=`pwd`/AppDir ninja -C build install/local
|
||||
- DESTDIR=`pwd`/AppDir ninja -C build _deps/cmark-build/src/install
|
||||
- mkdir -p AppDir/usr/lib/x86_64-linux-gnu AppDir/lib/x86_64-linux-gnu
|
||||
- appimage-builder --skip-test
|
||||
after_script:
|
||||
- bash ./.ci/upload-nightly-gitlab.sh nheko-latest-x86_64.AppImage
|
||||
rules:
|
||||
- if : '$CI_PIPELINE_TRIGGERED == null'
|
||||
artifacts:
|
||||
paths:
|
||||
- 'nheko-latest-x86_64.AppImage'
|
||||
expire_in: 1 week
|
||||
expose_as: 'appimage-amd64'
|
||||
cache:
|
||||
key: "$CI_JOB_NAME"
|
||||
paths:
|
||||
- .hunter/
|
||||
- .ccache
|
||||
|
||||
linting:
|
||||
stage: build
|
||||
image: alpine:latest
|
||||
tags: [docker]
|
||||
before_script:
|
||||
- apk update && apk add clang-extra-tools make git python3 py3-pip
|
||||
- apk update && apk add make git python3 py3-pip
|
||||
- apk add clang-extra-tools --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main
|
||||
- export PATH="$PATH:/root/.local/bin"
|
||||
- pip3 install --user reuse
|
||||
script:
|
||||
- make lint
|
||||
- make license
|
||||
rules:
|
||||
- if : '$CI_PIPELINE_TRIGGERED == null'
|
||||
|
||||
|
|
|
@ -0,0 +1,122 @@
|
|||
# appimage-builder recipe see https://appimage-builder.readthedocs.io for details
|
||||
version: 1
|
||||
AppDir:
|
||||
path: ./AppDir
|
||||
app_info:
|
||||
id: nheko
|
||||
name: nheko
|
||||
icon: nheko
|
||||
version: latest
|
||||
exec: usr/bin/nheko
|
||||
exec_args: $@
|
||||
runtime:
|
||||
env:
|
||||
APPDIR_LIBRARY_PATH: $APPDIR/usr/lib/x86_64-linux-gnu:$APPDIR/usr/lib/x86_64-linux-gnu/gstreamer-1.0:$APPDIR/usr/lib/x86_64-linux-gnu/gconv:$APPDIR/lib/x86_64-linux-gnu:$APPDIR/usr/lib/x86_64-linux-gnu/pulseaudio
|
||||
apt:
|
||||
arch: amd64
|
||||
allow_unauthenticated: true
|
||||
sources:
|
||||
- sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse
|
||||
- sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted universe multiverse
|
||||
- sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
|
||||
- sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse
|
||||
- sourceline: deb http://archive.canonical.com/ubuntu jammy partner
|
||||
key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x871920d1991bc93c
|
||||
include:
|
||||
# idk, need there ca-certificates, but some systems may not have
|
||||
- ca-certificates
|
||||
- gstreamer1.0-plugins-good
|
||||
- libbs2b0
|
||||
- libbz2-1.0
|
||||
- libcurl4
|
||||
- libelf1
|
||||
- libexpat1
|
||||
- libevent-core-2.1-7
|
||||
- libevent-pthreads-2.1-7
|
||||
- libjpeg-turbo8
|
||||
- libkf5archive5
|
||||
- liblmdb0
|
||||
- liblz4-1
|
||||
- libnorm1
|
||||
- libnss-mdns
|
||||
- libpcre3
|
||||
- qml-module-qt-labs-platform
|
||||
- qml-module-qt-labs-settings
|
||||
- qml-module-qtgraphicaleffects
|
||||
- qml-module-qtquick-particles2
|
||||
- qml-module-qtmultimedia
|
||||
- qml-module-qtquick2
|
||||
- qml-module-qtquick-controls2
|
||||
- qml-module-qtquick-layouts
|
||||
- qml-module-qtquick-window2
|
||||
- libcmark0.30.2
|
||||
- libfmt8
|
||||
- libolm3
|
||||
- libqt5core5a
|
||||
- libqt5dbus5
|
||||
- libqt5gui5
|
||||
- libqt5keychain1
|
||||
- libqt5multimedia5
|
||||
- libqt5multimedia5-plugins
|
||||
- libqt5network5
|
||||
- libqt5quickwidgets5
|
||||
- libqt5svg5
|
||||
- libqt5widgets5
|
||||
- libspdlog1-fmt8
|
||||
- libxcb-ewmh2
|
||||
- libxcb1
|
||||
- librubberband2
|
||||
- libsm6
|
||||
- libsnappy1v5
|
||||
- libxau6
|
||||
- libxcb-render-util0
|
||||
- libxcb-sync1
|
||||
- libxcb-xinerama0
|
||||
- libxcb-xkb1
|
||||
- libxcursor1
|
||||
- libxdmcp6
|
||||
- libxext6
|
||||
- libxfixes3
|
||||
- libxrender1
|
||||
- libxshmfence1
|
||||
- libxv1
|
||||
- libxxf86vm1
|
||||
- libzstd1
|
||||
exclude: []
|
||||
files:
|
||||
exclude:
|
||||
- usr/share/man
|
||||
- usr/share/doc
|
||||
- usr/bin/cmark
|
||||
- usr/bin/dbus*
|
||||
- usr/bin/openssl
|
||||
- usr/bin/c_rehash
|
||||
- usr/bin/session-migration
|
||||
- usr/include
|
||||
- usr/sbin
|
||||
- lib/systemd
|
||||
test:
|
||||
fedora:
|
||||
image: appimagecrafters/tests-env:fedora-30
|
||||
command: ./AppRun
|
||||
use_host_x: true
|
||||
debian:
|
||||
image: appimagecrafters/tests-env:debian-stable
|
||||
command: ./AppRun
|
||||
use_host_x: true
|
||||
arch:
|
||||
image: appimagecrafters/tests-env:archlinux-latest
|
||||
command: ./AppRun
|
||||
use_host_x: true
|
||||
centos:
|
||||
image: appimagecrafters/tests-env:centos-7
|
||||
command: ./AppRun
|
||||
use_host_x: true
|
||||
ubuntu:
|
||||
image: appimagecrafters/tests-env:ubuntu-xenial
|
||||
command: ./AppRun
|
||||
use_host_x: true
|
||||
AppImage:
|
||||
arch: x86_64
|
||||
update-information: None
|
||||
sign-key: None
|
187
CHANGELOG.md
|
@ -1,5 +1,192 @@
|
|||
# Changelog
|
||||
|
||||
## [0.11.3] -- 2023-02-23
|
||||
|
||||
### Bugfix
|
||||
|
||||
- Fix redundant null byte inserted with the emoji completer
|
||||
|
||||
## [0.11.2] -- 2023-02-20
|
||||
|
||||
### Highlights
|
||||
|
||||
- Improved Markdown input 🗒️
|
||||
- You can now enter strike-through and spoilers using `~~` and `||`
|
||||
respectively.
|
||||
- Single line-breaks now also create a line-break in the formatted message.
|
||||
- Code tags now preserve whitespace.
|
||||
- User search in the invite dialog 🧑🤝🧑 (Malte E)
|
||||
- Can search either locally or consult the user directory on your server.
|
||||
|
||||
### Features
|
||||
|
||||
- Allow disabling animations before login.
|
||||
- Set the window role to "imageoverlay" on X11. (Thulinma)
|
||||
|
||||
### Improvements
|
||||
|
||||
- The Nheko binary should now be slightly smaller.
|
||||
- You can now build Nheko against a system install of the blurhash and
|
||||
cpp-httplib libraries. (vitaly)
|
||||
- You can now enable scrollbars for the room and community lists in the
|
||||
settings. (balsof)
|
||||
- Add a generic video icon when there is no thumbnail. (LorenDB)
|
||||
- Pause video when switching rooms. (LorenDB)
|
||||
- Add a fancy delegate when encryption is enabled. (LorenDB)
|
||||
- Standardise command format messages. (phyto)
|
||||
- Automatically fetch keys for undecrypted messages after verification.
|
||||
- Remove all notifications on exit on Linux. (ShootingStarDragons)
|
||||
- Document markdown features and /cmark command in the man page. (tastytea)
|
||||
- Speedup the user completer.
|
||||
- Allow closing menus on Wayland by clicking the window. (ShootingStarDragons)
|
||||
- Merge Debian/Ubuntu Dependencies in the README. (enigma9o7)
|
||||
- Update zsh completions. (tastytea)
|
||||
- Skip empty requests for cross-signing keys when user only has one device.
|
||||
(Jason)
|
||||
- Hide image overlay when saving a file. (ShootingStarDragons)
|
||||
- Make it more obvious that the add reaction button is not an emoji.
|
||||
- Build only the gstreamer qml plugin in flatpak.
|
||||
- Update Ubuntu dependency list for building from source. (tastytea)
|
||||
|
||||
### Translations
|
||||
|
||||
- Estonian (Priit)
|
||||
- Ukrainian (NullPointerException)
|
||||
- Indonesian (Linerly)
|
||||
- Chinese (Poesty Li)
|
||||
- Esperanto (Tirifto)
|
||||
- French (MayeulC, CB, Glandos, Rick)
|
||||
- Dutch (Thulinma)
|
||||
- Italian (DynamoFox, Elia Tomasi, Joseph Curto, Quanterxotur)
|
||||
- Russian (Evgeny, SOT-TECH)
|
||||
- Finnish (Lurkki)
|
||||
|
||||
### Bugfixes
|
||||
|
||||
- You can now forward stickers again.
|
||||
- Edits shouldn't "jump" out of threads anymore.
|
||||
- Focus text input when quick switcher is closed. (LorenDB)
|
||||
- Fix rare freeze with an empty list in a completer.
|
||||
- Don't fail the plugins check on GStreamer 1.22 during a video call.
|
||||
- Allow nested ()/[] brackets in URLs. (mauke)
|
||||
- Make br tags work properly again.
|
||||
- Don't double free call devices. (Jason)
|
||||
- Work around multiple destructor calls on Clang. (Jason)
|
||||
- Html in sidebar.
|
||||
|
||||
### Notes
|
||||
|
||||
You may want to build against the most recent mtxclient (0.9.2) for additional
|
||||
bugfixes. cpp-httplib and blurhash are still bundled by default and shipped with
|
||||
the source tarball. Explicitly disable the bundling for those packages to build
|
||||
against system versions.
|
||||
|
||||
## [0.11.1] -- 2023-01-15
|
||||
|
||||
### Hotfix Release
|
||||
|
||||
- Fixes issue where CPU usage could be excessive even when nheko was idle or minimized. (See #1284)
|
||||
- Add failed state for queued (pending) messages
|
||||
|
||||
## [0.11.0] -- 2023-01-12
|
||||
|
||||
### Highlights
|
||||
|
||||
- Search in your timeline 🔍
|
||||
- Works in encrypted rooms.
|
||||
- Search is entirely local.
|
||||
- It might be a bit slow on some systems, since it needs to paginate the room
|
||||
to search instead of relying on the server.
|
||||
- Pushrule support! 🫸🫷
|
||||
- Notifications should now be faster and not rely on the server.
|
||||
- Notifications should work properly in encrypted rooms.
|
||||
- MSC3664 is supported for pushrules for reply (needs server support).
|
||||
- Mentions get highlighted in the timeline.
|
||||
- Decrypting notifications can be disabled for improved privacy.
|
||||
- Threads 🧵
|
||||
- Threads are a simple way to structure large rooms.
|
||||
- Start a new thread from any event.
|
||||
- Focus on a specific thread by clicking on the colored thread button next to
|
||||
any event from this thread.
|
||||
- Replies automatically land inside the thread.
|
||||
|
||||
### Features
|
||||
|
||||
- Remember where you left off using the new unread indicator! ---
|
||||
- Navigate to space when selected in quick switcher or via link.
|
||||
- (Re-)Add an AppImage build. (Zhymabek Roman)
|
||||
- Render and send confetti! 🎉 (LorenDB)
|
||||
- Focus text field on most key presses.
|
||||
- Show link to next room for tombstone events.
|
||||
- macOS: Only play notification sound when pushrule says so.
|
||||
- macOS: Builds for Apple Silicon.
|
||||
- macOS: Allow quick replies from notifications.
|
||||
- Completer for /commands.
|
||||
- Allow opening room settings from room list. (LorenDB)
|
||||
- Allow setting the status message via the dbus API. (LorenDB)
|
||||
- Check out this for one possible usecase: https://schlomp.space/tastytea/dotfiles/src/commit/485aa7103c4f414ce0731804acf34a65a772fd28/.local/bin/mpd2nheko (Setting your currently playing song as your status)
|
||||
- Allow swapping Enter and Shift-Enter. (LordMZTE)
|
||||
- Preliminary support for VoIP v1. (Rohit)
|
||||
- Allow applying permission changes in spaces recursively.
|
||||
- Allow modifying permissions of users not in the room.
|
||||
|
||||
### Improvements
|
||||
|
||||
- Prompt before deleting the database when the error could be resolved by the user.
|
||||
- Improve logging in particular for sync or registration errors.
|
||||
- Speedup quick switcher.
|
||||
- Prune image cache in the background.
|
||||
- Store all secrets encrypted in the database (apart from the pickle).
|
||||
- Speedup fetching olm sessions from the database.
|
||||
- Increase database resiliency at the cost of a lot of performance.
|
||||
- Rename spaces to communities.
|
||||
- Handle some rate limiting better in some cases.
|
||||
- More fine grained control over logging. (Forest)
|
||||
|
||||
### Translations
|
||||
|
||||
- Ukrainian (NullPointerException)
|
||||
- Indonesian (Linerly as always <3)
|
||||
- Portugese (Brazil) (Daimar, zerowhy, Terry)
|
||||
- Estonian (Priit also a valued regular)
|
||||
- Finnish (Lurkki, you might know them too!)
|
||||
- Chinese (Chen Shaoji, Poesty Li, ling, Eric)
|
||||
- Russian (SOT-TECH, Evgeny, Carmina16, Mihail Iosilevich, Artem, Herecore, Alexey Murz, glebasson)
|
||||
- Occidental (Carmina16)
|
||||
- Polish (Romanik)
|
||||
- Dutch (Thulinma)
|
||||
- French (GitEz-code, Guillaume Girol, lascapi)
|
||||
- Esperanto (Tirifto)
|
||||
|
||||
### Bugfixes
|
||||
|
||||
- Fix regional indicators. 🇦-🇿
|
||||
- Pasting from Safari on macOS.
|
||||
- Potential crash when closing the room directory.
|
||||
- text selection in the raw message dialog.
|
||||
- Pagination after a timeline clear.
|
||||
- Entering newlines on Windows.
|
||||
- Work around crash in QQC2 in alias dialog.
|
||||
- Fix forwarding between encrypted rooms.
|
||||
- Blurry icons on HiDPI screens. (q234rty)
|
||||
- Fix CMark warning when configuring. (FINALLY!)
|
||||
- Blurry thumbnails. (again?!?)
|
||||
- Upload box thumbnail size. (foxb612)
|
||||
- Previews getting sorted above normal rooms in space view.
|
||||
- Excessive summary calls.
|
||||
- Usage type buttons for Sticker/Emoji packs.
|
||||
- Old server lookups overwriting new ones, possibly preventing any login.
|
||||
- Crash in member list.
|
||||
- Stripping fallbacks of plain text bodies.
|
||||
- Different greens.
|
||||
- Spoilers in replies.
|
||||
- Invites without state.
|
||||
|
||||
### Notes
|
||||
|
||||
We bumped the required mtxclient version to 0.9.0 and the required coeurl
|
||||
version to 0.3.0. Supported Matrix API versions are now 1.1 to 1.5.
|
||||
|
||||
## [0.10.2] -- 2022-09-22
|
||||
|
||||
### Security release
|
||||
|
|
|
@ -18,17 +18,16 @@ set(
|
|||
CACHE
|
||||
FILEPATH "Default toolchain"
|
||||
)
|
||||
set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard")
|
||||
set(CMAKE_CXX_STANDARD 20 CACHE STRING "C++ standard")
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON CACHE BOOL "Require C++ standard to be supported")
|
||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL "compile as PIC by default")
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
|
||||
option(HUNTER_ENABLED "Enable Hunter package manager" OFF)
|
||||
include("cmake/HunterGate.cmake")
|
||||
HunterGate(
|
||||
URL "https://github.com/cpp-pm/hunter/archive/v0.24.3.tar.gz"
|
||||
SHA1 "10738b59e539818a01090e64c2d09896247530c7"
|
||||
LOCAL
|
||||
URL "https://github.com/cpp-pm/hunter/archive/v0.24.8.tar.gz"
|
||||
SHA1 "ca7838dded9a1811b04ffd56175f629e0af82d3d"
|
||||
LOCAL
|
||||
)
|
||||
|
||||
macro(hunter_add_package_safe)
|
||||
|
@ -60,8 +59,11 @@ option(USE_BUNDLED_LMDBXX "Use the bundled version of lmdb++." ${HUNTER_ENABLED}
|
|||
option(USE_BUNDLED_QTKEYCHAIN "Use the bundled version of Qt5Keychain." ${HUNTER_ENABLED})
|
||||
option(USE_BUNDLED_COEURL "Use a bundled version of the Curl wrapper"
|
||||
${HUNTER_ENABLED})
|
||||
option(USE_BUNDLED_LIBEVENT "Use the bundled version of spdlog." ${HUNTER_ENABLED})
|
||||
option(USE_BUNDLED_LIBCURL "Use the bundled version of spdlog." ${HUNTER_ENABLED})
|
||||
option(USE_BUNDLED_LIBEVENT "Use the bundled version of libevent." ${HUNTER_ENABLED})
|
||||
option(USE_BUNDLED_LIBCURL "Use the bundled version of libcurl." ${HUNTER_ENABLED})
|
||||
option(USE_BUNDLED_RE2 "Use the bundled version of re2." ${HUNTER_ENABLED})
|
||||
option(USE_BUNDLED_CPPHTTPLIB "Use the bundled version of cpp-httplib." ON)
|
||||
option(USE_BUNDLED_BLURHASH "Use the bundled version of blurhash." ON)
|
||||
|
||||
include(CMakeDependentOption)
|
||||
set(VOIP_DEFAULT ON)
|
||||
|
@ -107,8 +109,8 @@ project(nheko LANGUAGES CXX C)
|
|||
include(GNUInstallDirs)
|
||||
|
||||
set(CPACK_PACKAGE_VERSION_MAJOR "0")
|
||||
set(CPACK_PACKAGE_VERSION_MINOR "10")
|
||||
set(CPACK_PACKAGE_VERSION_PATCH "2")
|
||||
set(CPACK_PACKAGE_VERSION_MINOR "11")
|
||||
set(CPACK_PACKAGE_VERSION_PATCH "3")
|
||||
set(PROJECT_VERSION_MAJOR ${CPACK_PACKAGE_VERSION_MAJOR})
|
||||
set(PROJECT_VERSION_MINOR ${CPACK_PACKAGE_VERSION_MINOR})
|
||||
set(PROJECT_VERSION_PATCH ${CPACK_PACKAGE_VERSION_PATCH})
|
||||
|
@ -119,7 +121,7 @@ fix_project_version()
|
|||
|
||||
# Set additional project information
|
||||
set(COMPANY "Nheko")
|
||||
set(COPYRIGHT "Copyright (c) 2022 Nheko Contributors")
|
||||
set(COPYRIGHT "Copyright (c) 2023 Nheko Contributors")
|
||||
set(IDENTIFIER "io.github.nheko-reborn.nheko")
|
||||
|
||||
add_project_meta(META_FILES_TO_INCLUDE)
|
||||
|
@ -186,13 +188,13 @@ if(USE_BUNDLED_COEURL)
|
|||
FetchContent_Declare(
|
||||
coeurl
|
||||
GIT_REPOSITORY https://nheko.im/Nheko-Reborn/coeurl.git
|
||||
GIT_TAG v0.2.1
|
||||
GIT_TAG v0.3.0
|
||||
)
|
||||
FetchContent_MakeAvailable(coeurl)
|
||||
set(COEURL_TARGET_NAME coeurl::coeurl)
|
||||
else()
|
||||
find_package(PkgConfig)
|
||||
pkg_check_modules(coeurl IMPORTED_TARGET coeurl>=0.1.1)
|
||||
pkg_check_modules(coeurl IMPORTED_TARGET coeurl>=0.3.0)
|
||||
if (TARGET PkgConfig::coeurl)
|
||||
set(COEURL_TARGET_NAME PkgConfig::coeurl)
|
||||
endif()
|
||||
|
@ -209,6 +211,15 @@ if (NOT COEURL_TARGET_NAME)
|
|||
message(ERROR "Couldn't find coeurl")
|
||||
endif()
|
||||
|
||||
if(USE_BUNDLED_RE2)
|
||||
hunter_add_package(re2)
|
||||
find_package(re2 CONFIG REQUIRED)
|
||||
else()
|
||||
find_package(PkgConfig REQUIRED)
|
||||
pkg_check_modules(re2 REQUIRED IMPORTED_TARGET re2)
|
||||
endif()
|
||||
|
||||
|
||||
#
|
||||
# LMDB
|
||||
#
|
||||
|
@ -365,6 +376,8 @@ set(SRC_FILES
|
|||
src/timeline/Reaction.h
|
||||
src/timeline/RoomlistModel.cpp
|
||||
src/timeline/RoomlistModel.h
|
||||
src/timeline/TimelineFilter.cpp
|
||||
src/timeline/TimelineFilter.h
|
||||
src/timeline/TimelineModel.cpp
|
||||
src/timeline/TimelineModel.h
|
||||
src/timeline/TimelineViewManager.cpp
|
||||
|
@ -391,8 +404,6 @@ set(SRC_FILES
|
|||
src/ui/RoomSummary.h
|
||||
src/ui/Theme.cpp
|
||||
src/ui/Theme.h
|
||||
src/ui/ThemeManager.cpp
|
||||
src/ui/ThemeManager.h
|
||||
src/ui/UIA.cpp
|
||||
src/ui/UIA.h
|
||||
src/ui/UserProfile.cpp
|
||||
|
@ -440,6 +451,8 @@ set(SRC_FILES
|
|||
src/ColorImageProvider.h
|
||||
src/CombinedImagePackModel.cpp
|
||||
src/CombinedImagePackModel.h
|
||||
src/CommandCompleter.cpp
|
||||
src/CommandCompleter.h
|
||||
src/CompletionModelRoles.h
|
||||
src/CompletionProxyModel.cpp
|
||||
src/CompletionProxyModel.h
|
||||
|
@ -480,6 +493,8 @@ set(SRC_FILES
|
|||
src/SingleImagePackModel.h
|
||||
src/TrayIcon.cpp
|
||||
src/TrayIcon.h
|
||||
src/UserDirectoryModel.cpp
|
||||
src/UserDirectoryModel.h
|
||||
src/UserSettingsPage.cpp
|
||||
src/UserSettingsPage.h
|
||||
src/UsersModel.cpp
|
||||
|
@ -581,14 +596,14 @@ if(USE_BUNDLED_MTXCLIENT)
|
|||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
MatrixClient
|
||||
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
|
||||
GIT_TAG v0.8.2
|
||||
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
|
||||
GIT_TAG v0.9.2
|
||||
)
|
||||
set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "")
|
||||
set(BUILD_LIB_TESTS OFF CACHE INTERNAL "")
|
||||
FetchContent_MakeAvailable(MatrixClient)
|
||||
else()
|
||||
find_package(MatrixClient 0.8.1 REQUIRED)
|
||||
find_package(MatrixClient 0.9.0 REQUIRED)
|
||||
endif()
|
||||
|
||||
if (VOIP)
|
||||
|
@ -618,9 +633,9 @@ set(TRANSLATION_DEPS ${LANG_QRC} ${QRC} ${QM_SRC})
|
|||
|
||||
if (APPLE)
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework Foundation -framework Cocoa -framework UserNotifications")
|
||||
set(SRC_FILES ${SRC_FILES} src/notifications/ManagerMac.mm src/notifications/ManagerMac.cpp src/emoji/MacHelper.mm src/emoji/MacHelper.h)
|
||||
set(SRC_FILES ${SRC_FILES} src/notifications/NotificationManagerProxy.h src/notifications/MacNotificationDelegate.h src/notifications/MacNotificationDelegate.mm src/notifications/ManagerMac.mm src/notifications/ManagerMac.cpp src/emoji/MacHelper.mm src/emoji/MacHelper.h)
|
||||
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.16.0")
|
||||
set_source_files_properties( src/notifications/ManagerMac.mm src/emoji/MacHelper.mm src/emoji/MacHelper.h PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
|
||||
set_source_files_properties( src/notifications/NotificationManagerProxy.h src/notifications/MacNotificationDelegate.h src/notifications/MacNotificationDelegate.mm src/notifications/ManagerMac.mm src/emoji/MacHelper.mm src/emoji/MacHelper.h PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
|
||||
endif()
|
||||
elseif (WIN32)
|
||||
file(DOWNLOAD
|
||||
|
@ -664,6 +679,11 @@ else()
|
|||
endif()
|
||||
endif()
|
||||
|
||||
set_target_properties(nheko
|
||||
PROPERTIES
|
||||
CMAKE_SKIP_INSTALL_RPATH TRUE
|
||||
AUTOMOC ON)
|
||||
|
||||
if(APPLE)
|
||||
target_link_libraries (nheko PRIVATE Qt5::MacExtras)
|
||||
elseif(WIN32)
|
||||
|
@ -679,13 +699,28 @@ else()
|
|||
endif()
|
||||
endif()
|
||||
|
||||
target_include_directories(nheko PRIVATE src includes third_party/blurhash third_party/cpp-httplib-0.5.12)
|
||||
set(THIRD_PARTY_SRC_FILES
|
||||
third_party/blurhash/blurhash.cpp
|
||||
third_party/blurhash/blurhash.hpp
|
||||
third_party/cpp-httplib-0.5.12/httplib.h
|
||||
target_include_directories(nheko PRIVATE src includes)
|
||||
|
||||
if (USE_BUNDLED_CPPHTTPLIB)
|
||||
target_include_directories(nheko PRIVATE third_party/cpp-httplib-0.5.12)
|
||||
target_sources(nheko PRIVATE third_party/cpp-httplib-0.5.12/httplib.h)
|
||||
else()
|
||||
find_package(httplib REQUIRED)
|
||||
target_link_libraries(nheko PRIVATE httplib::httplib)
|
||||
endif()
|
||||
|
||||
if (USE_BUNDLED_BLURHASH)
|
||||
target_include_directories(nheko PRIVATE third_party/blurhash)
|
||||
set(BLURHASH_SRC_FILES
|
||||
third_party/blurhash/blurhash.cpp
|
||||
third_party/blurhash/blurhash.hpp
|
||||
)
|
||||
target_sources(nheko PRIVATE ${THIRD_PARTY_SRC_FILES})
|
||||
target_sources(nheko PRIVATE ${BLURHASH_SRC_FILES})
|
||||
else()
|
||||
find_package(PkgConfig REQUIRED)
|
||||
pkg_check_modules(blurhash REQUIRED IMPORTED_TARGET blurhash)
|
||||
target_link_libraries(nheko PRIVATE PkgConfig::blurhash)
|
||||
endif()
|
||||
|
||||
# Fixup bundled keychain include dirs
|
||||
if (USE_BUNDLED_QTKEYCHAIN)
|
||||
|
@ -757,8 +792,6 @@ if(MAN)
|
|||
add_subdirectory(man)
|
||||
endif()
|
||||
|
||||
set_target_properties(nheko PROPERTIES CMAKE_SKIP_INSTALL_RPATH TRUE)
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
if(FLATPAK)
|
||||
set(APPID "io.github.NhekoReborn.Nheko")
|
||||
|
|
93
README.md
|
@ -99,6 +99,11 @@ sudo emerge -a nheko
|
|||
|
||||
If you are using Gnome Keyring or KeepassXC as your secrets daemon, ensure that the `gnome-keyring` useflag is enabled on `dev-libs/qtkeychain`.
|
||||
|
||||
#### Mageia (9 and above)
|
||||
```bash
|
||||
sudo urpmi nheko
|
||||
```
|
||||
|
||||
#### Nix(os)
|
||||
|
||||
```bash
|
||||
|
@ -144,6 +149,15 @@ flatpak install flathub io.github.NhekoReborn.Nheko
|
|||
guix install nheko
|
||||
```
|
||||
|
||||
#### Steam Deck
|
||||
|
||||
Install nheko via the `Discover` app in Desktop Mode (this installs the flatpak). To also make it work in Game Mode you'll have create a wrapper script that starts kwalletd and then nheko. You can create `/home/deck/nheko.sh` with the following content and then add this script as a "Non-Steam Game" to Steam.
|
||||
```bash
|
||||
#!/bin/sh
|
||||
kwalletd5&
|
||||
flatpak run --env=XDG_CURRENT_DESKTOP=KDE --env=KDE_SESSION_VERSION=5 --branch=stable --arch=x86_64 --command=io.github.NhekoReborn.Nheko --file-forwarding io.github.NhekoReborn.Nheko @@u @@
|
||||
```
|
||||
|
||||
#### macOS (10.14 and above)
|
||||
|
||||
with [homebrew](https://brew.sh/):
|
||||
|
@ -216,6 +230,15 @@ sharing easier.
|
|||
|
||||
---
|
||||
|
||||
**Q:** I can't see some image types!
|
||||
|
||||
**A:** Nheko uses Qt's image plugins to render images. You might need to install
|
||||
additional packages to display some image types like webp. Usually those
|
||||
packages are called `qt5-image-formats-plugins`, `qt5-imageformats` or similar.
|
||||
KDE has similar plugins, that can extend the supported image types even more.
|
||||
|
||||
---
|
||||
|
||||
### Build Requirements
|
||||
|
||||
- Qt5 (5.15 or greater). Required for overlapping hover handlers in Qml.
|
||||
|
@ -223,10 +246,10 @@ sharing easier.
|
|||
- [mtxclient](https://github.com/Nheko-Reborn/mtxclient)
|
||||
- [coeurl](https://nheko.im/nheko-reborn/coeurl)
|
||||
- [LMDB](https://symas.com/lightning-memory-mapped-database/)
|
||||
- [lmdb++](https://github.com/hoytech/lmdbxx)
|
||||
- [lmdb++](https://github.com/hoytech/lmdbxx) (0.9.14 too old)
|
||||
- [cmark](https://github.com/commonmark/cmark) 0.29 or greater.
|
||||
- [libolm](https://gitlab.matrix.org/matrix-org/olm)
|
||||
- [spdlog](https://github.com/gabime/spdlog)
|
||||
- [spdlog](https://github.com/gabime/spdlog) (1.8.1 too old)
|
||||
- [GStreamer](https://gitlab.freedesktop.org/gstreamer) 1.18.0 or greater (optional, needed for VoIP support. Pass `-DVOIP=OFF` to disable.).
|
||||
- Installing the gstreamer core library plus gst-plugins-base, gst-plugins-good & gst-plugins-bad
|
||||
is often sufficient. The qmlgl plugin though is often packaged separately. The actual plugin requirements
|
||||
|
@ -236,9 +259,9 @@ sharing easier.
|
|||
- [libnice](https://gitlab.freedesktop.org/libnice/libnice)
|
||||
- XCB, XCB-EWMH: For screensharing support on X11. VOIP needs to be enabled. Can be disabled with `-DSCREENSHARE_X11=OFF`.
|
||||
- [qtkeychain](https://github.com/frankosterfeld/qtkeychain) (You need at least version 0.12 for proper Gnome Keychain support. The bundled version requires libsecret, unless you pass `-DLIBSECRET_SUPPORT=OFF`.)
|
||||
- A compiler that supports C++ 17:
|
||||
- Clang 6 (tested on Travis CI)
|
||||
- GCC 7 (tested on Travis CI)
|
||||
- A compiler that supports C++ 20:
|
||||
- Clang 11 (Only clazy 13 is tested in CI)
|
||||
- GCC 10 (tested on Gitlab CI)
|
||||
- MSVC 19.13 (tested on AppVeyor)
|
||||
|
||||
Nheko can use bundled version for most of those libraries automatically, if the versions in your distro are too old.
|
||||
|
@ -264,7 +287,7 @@ The bundle flags are currently:
|
|||
|
||||
A note on bundled OpenSSL: You need to explicitly enable it and it will not be using your system certificate directory by default, if you enable it. You need to override that at runtime with the SSL_CERT_FILE variable. On Windows it will still be using your system certificates though, since it loads them from the system store instead of the OpenSSL directory.
|
||||
|
||||
#### Linux
|
||||
#### Linux (Appimage)
|
||||
|
||||
If you don't want to install any external dependencies, you can generate an AppImage locally using docker. It is not that well maintained though...
|
||||
|
||||
|
@ -272,7 +295,7 @@ If you don't want to install any external dependencies, you can generate an AppI
|
|||
make docker-app-image
|
||||
```
|
||||
|
||||
##### Arch Linux
|
||||
#### Arch Linux
|
||||
|
||||
```bash
|
||||
sudo pacman -S qt5-base \
|
||||
|
@ -288,61 +311,51 @@ sudo pacman -S qt5-base \
|
|||
qtkeychain-qt5
|
||||
```
|
||||
|
||||
##### Gentoo Linux
|
||||
|
||||
#### Debian 11+ / Ubuntu 22.04
|
||||
*Older OS versions require a newer version of Qt5 than offered in official repositories.*
|
||||
*Build requirements + qml modules needed at runtime (you may not need all of them, but the following seem to work according to reports):*
|
||||
```bash
|
||||
sudo emerge -a ">=dev-qt/qtgui-5.10.0" media-libs/fontconfig dev-libs/qtkeychain
|
||||
sudo apt install --no-install-recommends g++ cmake make zlib1g-dev libssl-dev libolm-dev liblmdb-dev libcmark-dev nlohmann-json3-dev libspdlog-dev libevent-dev libcurl4-openssl-dev libre2-dev libxcb-ewmh-dev asciidoc-base \
|
||||
qt{base,declarative,tools,multimedia,quickcontrols2-}5-dev libqt5svg5-dev qt5keychain-dev qml-module-qt{gstreamer,multimedia,quick-extras,-labs-settings,-labs-platform,graphicaleffects,quick-controls2,quick-particles2} \
|
||||
libgstreamer1.0-dev libgstreamer-plugins-{base,bad}1.0-dev qtgstreamer-plugins-qt5 libnice-dev
|
||||
```
|
||||
lmdb++-dev is too old so bundled lmdbxx must be used.
|
||||
libspdlog-dev in debian bullseye is too old (without backporting) so requires using hunter to use bundled spdlog.
|
||||
Suggested flags for debian bullseye: `-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF -DUSE_BUNDLED_OPENSSL=OFF`
|
||||
Suggested flags for debian bookworm: `-DUSE_BUNDLED_COEURL=1 -DUSE_BUNDLED_MTXCLIENT=1 -DUSE_BUNDLED_LMDBXX=1`
|
||||
|
||||
##### Ubuntu 20.04
|
||||
|
||||
```bash
|
||||
# Build requirements + qml modules needed at runtime (you may not need all of them, but the following seem to work according to reports):
|
||||
sudo apt install g++ cmake zlib1g-dev libssl-dev qt{base,declarative,tools,multimedia,quickcontrols2-}5-dev libqt5svg5-dev libboost-system-dev libboost-thread-dev libboost-iostreams-dev libolm-dev liblmdb++-dev libcmark-dev nlohmann-json3-dev libspdlog-dev libgtest-dev qml-module-qt{gstreamer,multimedia,quick-extras,-labs-settings,-labs-platform,graphicaleffects,quick-controls2} qt5keychain-dev libevent-dev libcurl-dev
|
||||
```
|
||||
This will install all dependencies, except for tweeny (use bundled tweeny)
|
||||
and mtxclient (needs to be build separately).
|
||||
|
||||
##### Debian Buster (or higher probably)
|
||||
|
||||
(User report, not sure if all of those are needed)
|
||||
|
||||
```bash
|
||||
sudo apt install cmake gcc make automake liblmdb-dev \
|
||||
qt5-default libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev \
|
||||
qml-module-qtgstreamer qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev \
|
||||
qml-module-qtgraphicaleffects qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform\
|
||||
qt5keychain-dev asciidoctor libsecret-1-dev
|
||||
```
|
||||
|
||||
##### Fedora
|
||||
#### Fedora
|
||||
|
||||
```bash
|
||||
sudo dnf builddep nheko # note that some newer packages might not be captured by that
|
||||
```
|
||||
|
||||
##### Guix
|
||||
#### Gentoo Linux
|
||||
|
||||
```bash
|
||||
sudo emerge -a ">=dev-qt/qtgui-5.15.0" media-libs/fontconfig dev-libs/qtkeychain
|
||||
```
|
||||
|
||||
#### Guix
|
||||
|
||||
```bash
|
||||
guix environment nheko
|
||||
```
|
||||
|
||||
##### macOS (Xcode 10.2 or later)
|
||||
|
||||
#### macOS (Xcode 10.2 or later)
|
||||
|
||||
```bash
|
||||
brew update
|
||||
brew install qt5 lmdb cmake llvm spdlog boost cmark libolm qtkeychain
|
||||
```
|
||||
|
||||
##### Windows
|
||||
#### Windows
|
||||
|
||||
1. Install Visual Studio 2017's "Desktop Development" and "Linux Development with C++"
|
||||
1. Install Visual Studio 2022's "Desktop Development" and "Linux Development with C++"
|
||||
(for the CMake integration) workloads.
|
||||
|
||||
2. Download the latest Qt for windows installer and install it somewhere.
|
||||
Make sure to install the `MSVC 2017 64-bit` toolset for at least Qt 5.10
|
||||
(lower versions does not support VS2017).
|
||||
Make sure to install the `MSVC 2022 64-bit` toolset for at least Qt 5.15.
|
||||
|
||||
3. If you don't have openssl installed, you will need to install perl to build it (i.e. Strawberry Perl).
|
||||
|
||||
|
@ -392,7 +405,7 @@ You need to fill out the paths for the `Qt5_DIR`.
|
|||
The Qt5 dir should point to the `lib\cmake\Qt5` dir.
|
||||
|
||||
Examples for the paths are:
|
||||
- `C:\\Qt\\5.10.1\\msvc2017_64\\lib\\cmake\\Qt5`
|
||||
- `C:\\Qt\\5.15.1\\msvc2017_64\\lib\\cmake\\Qt5`
|
||||
|
||||
You should also enable hunter by setting `HUNTER_ENABLED` to `ON` and `BUILD_SHARED_LIBS` to `OFF`.
|
||||
|
||||
|
|
17
appveyor.yml
|
@ -1,9 +1,9 @@
|
|||
---
|
||||
|
||||
version: 0.10.2-{build}
|
||||
version: 0.11.3-{build}
|
||||
|
||||
configuration: Release
|
||||
image: Visual Studio 2019
|
||||
image: Visual Studio 2022
|
||||
platform: x64
|
||||
|
||||
environment:
|
||||
|
@ -23,16 +23,14 @@ build:
|
|||
|
||||
install:
|
||||
- set QT_DIR=C:\Qt\5.15\msvc2019_64
|
||||
- set PATH=Path=C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin;C:\Program Files\Git\cmd;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\PowerShell\7\;C:\Program Files\7-Zip;C:\Program Files\Microsoft\Web Platform Installer\;C:\Tools\NuGet;C:\Tools\PsTools;C:\Program Files\Git\usr\bin;C:\Program Files\Git LFS;C:\Program Files\Mercurial\;C:\Program Files (x86)\Subversion\bin;C:\Program Files\Docker\Docker\resources\bin;C:\ProgramData\DockerDesktop\version-bin;C:\Program Files\dotnet\;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\150;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin;C:\Tools\xUnit;C:\Tools\xUnit20;C:\Tools\NUnit\bin;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\Extensions\TestPlatform;C:\Ruby193\bin;C:\Tools\WebDriver;C:\Python27;C:\Python27\Scripts;C:\Program Files\erl10.7\bin;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files (x86)\Microsoft DirectX SDK;C:\Program Files\Microsoft Service Fabric\bin\Fabric\Fabric.Code;C:\Program Files\Microsoft SDKs\Service Fabric\Tools\ServiceFabricLocalClusterManager;C:\Tools\Doxygen;C:\Program Files (x86)\CMake\bin;C:\ProgramData\chocolatey\bin;C:\Tools\vcpkg;C:\Tools\Coverity\bin;C:\Program Files (x86)\NSIS;C:\Tools\Octopus;C:\Program Files\Meson\;C:\Tools\GitVersion;C:\Tools\NUnit3\bin;C:\Users\appveyor\AppData\Local\Microsoft\WindowsApps;C:\Users\appveyor\.dotnet\tools;C:\Program Files\AppVeyor\BuildAgent\
|
||||
- set PATH=C:\Strawberry\perl\bin;C:\Python39-x64;%QT_DIR%\bin;%PATH%
|
||||
- call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
|
||||
|
||||
build_script:
|
||||
# VERSION format: branch-master/branch-1.2
|
||||
# INSTVERSION format: x.y.z
|
||||
# WINVERSION format: 9999.0.0.123/1.2.0.234
|
||||
- if "%APPVEYOR_REPO_TAG%"=="false" set INSTVERSION=0.10.2
|
||||
- if "%APPVEYOR_REPO_TAG%"=="false" set VERSION=0.10.2
|
||||
- if "%APPVEYOR_REPO_TAG%"=="false" set INSTVERSION=0.11.3
|
||||
- if "%APPVEYOR_REPO_TAG%"=="false" set VERSION=0.11.3
|
||||
- if "%APPVEYOR_REPO_TAG%"=="false" if "%APPVEYOR_REPO_BRANCH%"=="master" set INSTVERSION=9999.0
|
||||
- if "%APPVEYOR_REPO_TAG%"=="false" set WINVERSION=%INSTVERSION%.0.%APPVEYOR_BUILD_NUMBER%
|
||||
# VERSION format: v1.2.3/v1.3.4
|
||||
|
@ -47,13 +45,14 @@ build_script:
|
|||
- echo %DATE%
|
||||
|
||||
# Build nheko
|
||||
- cmake -G "Visual Studio 16 2019" -A x64 -H. -Bbuild
|
||||
- cmake -G "Visual Studio 17 2022" -A x64 -H. -Bbuild
|
||||
-DHUNTER_ROOT="C:\hunter"
|
||||
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF -DUSE_BUNDLED_OPENSSL=ON
|
||||
-DCMAKE_BUILD_TYPE=Release -DHUNTER_CONFIGURATION_TYPES=Release
|
||||
|
||||
- cmake --build build --config Release
|
||||
|
||||
- call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
|
||||
- git clone https://github.com/Nheko-Reborn/qt-jdenticon.git
|
||||
- cd qt-jdenticon
|
||||
- qmake
|
||||
|
@ -94,8 +93,8 @@ after_build:
|
|||
- copy %BUILD%\deploy\installer\gui\package.xml installer\packages\io.github.nhekoreborn.nheko\meta
|
||||
- copy %BUILD%\deploy\installer\gui\installscript.qs installer\packages\io.github.nhekoreborn.nheko\meta
|
||||
# Amend version and date
|
||||
- sed -i "s/__VERSION__/0.10.2/" installer\config\config.xml
|
||||
- sed -i "s/__VERSION__/0.10.2/" installer\packages\io.github.nhekoreborn.nheko\meta\package.xml
|
||||
- sed -i "s/__VERSION__/0.11.3/" installer\config\config.xml
|
||||
- sed -i "s/__VERSION__/0.11.3/" installer\packages\io.github.nhekoreborn.nheko\meta\package.xml
|
||||
- sed -i "s/__DATE__/%DATE%/" installer\packages\io.github.nhekoreborn.nheko\meta\package.xml
|
||||
# Copy nheko data
|
||||
- xcopy NhekoData\*.* installer\packages\io.github.nhekoreborn.nheko\data\*.* /s /e /c /y
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# CMake module to search for the cmark library
|
||||
#
|
||||
|
||||
include(FindPkgConfig)
|
||||
find_package(PkgConfig)
|
||||
pkg_check_modules(PC_CMARK QUIET cmark)
|
||||
|
||||
if(NOT CMARK_INCLUDE_DIR)
|
||||
|
@ -34,9 +34,8 @@ endif()
|
|||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(cmark
|
||||
DEFAULT_MSG
|
||||
CMARK_INCLUDE_DIR
|
||||
CMARK_LIBRARY)
|
||||
REQUIRED_VARS CMARK_LIBRARY CMARK_INCLUDE_DIR
|
||||
)
|
||||
|
||||
mark_as_advanced(CMARK_LIBRARY CMARK_INCLUDE_DIR)
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
namespace nheko {
|
||||
constexpr auto version = "${PROJECT_VERSION}";
|
||||
constexpr auto build_os = "${CMAKE_HOST_SYSTEM_NAME}";
|
||||
constexpr auto enable_debug_log = ${SPDLOG_DEBUG_ON};
|
||||
inline constexpr auto version = "${PROJECT_VERSION}";
|
||||
inline constexpr auto build_os = "${CMAKE_HOST_SYSTEM_NAME}";
|
||||
inline constexpr auto enable_debug_log = ${SPDLOG_DEBUG_ON};
|
||||
}
|
||||
|
||||
# cmakedefine01 HAVE_BACKTRACE_SYMBOLS_FD
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
{ pkgs ? import <nixos> { } }:
|
||||
|
||||
pkgs.nheko.overrideAttrs (old: {
|
||||
src = builtins.filterSource (path: type: path != "result") ./.;
|
||||
})
|
|
@ -1,7 +1,7 @@
|
|||
id: io.github.NhekoReborn.Nheko
|
||||
command: io.github.NhekoReborn.Nheko
|
||||
runtime: org.kde.Platform
|
||||
runtime-version: '5.15-21.08'
|
||||
runtime-version: '5.15-22.08'
|
||||
sdk: org.kde.Sdk
|
||||
finish-args:
|
||||
- --device=dri
|
||||
|
@ -20,14 +20,27 @@ finish-args:
|
|||
- --allow=per-app-dev-shm
|
||||
cleanup:
|
||||
- /include
|
||||
- /lib/pkgconfig
|
||||
- /bin/mdb*
|
||||
- '*.a'
|
||||
- /libexec
|
||||
- /lib/cmake/
|
||||
- /lib/cmake
|
||||
- /bin/cmark
|
||||
- /bin/event_rpcgen.py
|
||||
- /bin/playout
|
||||
- /bin/secret-tool
|
||||
- /bin/gst-*
|
||||
- /share/gdb
|
||||
- /share/gst*
|
||||
- /lib/girepository-1.0/
|
||||
- /lib/gst-validate-launcher/
|
||||
- /lib/gstreamer-1.0/include
|
||||
- /lib/gstreamer-1.0/include/
|
||||
- /lib/gstreamer-1.0/libgstcoreelements.so
|
||||
- /lib/gstreamer-1.0/libgstopengl*
|
||||
- /lib/gstreamer-1.0/libgstximagesink.so
|
||||
- /lib/gstreamer-1.0/validate/
|
||||
- /lib/libgst*
|
||||
modules:
|
||||
- name: lmdb
|
||||
sources:
|
||||
|
@ -145,6 +158,33 @@ modules:
|
|||
- sha256: 1155fd1a83049767360e9a120c43c578145db3204d2b309eba49fbbedd0f4ed3
|
||||
type: archive
|
||||
url: https://github.com/nlohmann/json/archive/v3.10.4.tar.gz
|
||||
- buildsystem: simple
|
||||
build-commands:
|
||||
- make static
|
||||
- make prefix=/app static-install
|
||||
name: re2
|
||||
sources:
|
||||
- sha256: f89c61410a072e5cbcf8c27e3a778da7d6fd2f2b5b1445cd4f4508bee946ab0f
|
||||
type: archive
|
||||
url: https://github.com/google/re2/archive/refs/tags/2022-06-01.tar.gz
|
||||
- buildsystem: meson
|
||||
name: gstreamer
|
||||
sources:
|
||||
- commit: f7806a854aad960eae3288db4a67a574f92428fe
|
||||
tag: 1.20.5
|
||||
type: git
|
||||
url: https://gitlab.freedesktop.org/gstreamer/gstreamer.git
|
||||
config-opts:
|
||||
- --auto-features=disabled
|
||||
- -Dgood=enabled
|
||||
- -Dgst-plugins-good:qt5=enabled
|
||||
- -Dqt5=enabled
|
||||
- -Dbase=enabled
|
||||
- -Dgst-plugins-base:gl=enabled
|
||||
- -Dgst-plugins-base:gl_platform=glx,egl
|
||||
- -Dgst-plugins-base:gl_winsys=x11,wayland
|
||||
- -Dgst-plugins-base:x11=enabled
|
||||
- -Dgst-plugins-base:xshm=enabled
|
||||
- buildsystem: qmake
|
||||
name: qt-jdenticon
|
||||
no-make-install: true
|
||||
|
@ -161,8 +201,8 @@ modules:
|
|||
- -Ddefault_library=static
|
||||
name: coeurl
|
||||
sources:
|
||||
- commit: cfeae3acef061dbb19706f462ee58b9be2e6ec76
|
||||
tag: v0.2.1
|
||||
- commit: 2a20a129240a1a017b37b6874faab499ca4e523b
|
||||
tag: v0.3.0
|
||||
type: git
|
||||
url: https://nheko.im/nheko-reborn/coeurl.git
|
||||
- config-opts:
|
||||
|
@ -173,8 +213,8 @@ modules:
|
|||
buildsystem: cmake-ninja
|
||||
name: mtxclient
|
||||
sources:
|
||||
- commit: 42bf1fd01d5b5aca58c1b284510fc1a30d949785
|
||||
tag: v0.8.2
|
||||
- commit: a9a6087ae820c8fb9332422b094cab8e2301db25
|
||||
tag: v0.9.2
|
||||
type: git
|
||||
url: https://github.com/Nheko-Reborn/mtxclient.git
|
||||
- config-opts:
|
||||
|
|
|
@ -31,7 +31,27 @@ Displays help including Qt specific options.
|
|||
Displays version information.
|
||||
|
||||
*--debug*::
|
||||
Enables debug output.
|
||||
Alias for _--log-level trace_.
|
||||
|
||||
*-l*, *--log-level* _<level>_::
|
||||
Set the global log level, or a comma-separated list of _<component>=<level>_
|
||||
pairs, or both. For example, to set the default log level to _warn_ but
|
||||
disable logging for the _ui_ component, pass _warn,ui=off_.
|
||||
+
|
||||
levels: _trace_ _debug_ _info_ _warning_ _error_ _critical_ _off_
|
||||
+
|
||||
components: _crypto_ _db_ _mtx_ _net_ _qml_ _ui_
|
||||
+
|
||||
Log levels can also be set in the NHEKO_LOG_LEVEL environment variable, using
|
||||
the same syntax. It will be overridden by this command line option.
|
||||
|
||||
*-L*, *--log-type* _<type>_::
|
||||
Set the log output type. A comma-separated list is allowed. The default is _file,stderr_.
|
||||
+
|
||||
types: _file_ _stderr_ _none_
|
||||
+
|
||||
The log type can also be set in the NHEKO_LOG_TYPE environment variable,
|
||||
which will be overridden by this command line option.
|
||||
|
||||
*-p* _<profile>_, *--profile* _<profile>_::
|
||||
Creates a unique profile, which allows you to log into several accounts at the
|
||||
|
@ -140,6 +160,12 @@ Send a message as a reaction when you’re replying to a message.
|
|||
*/md* _<message>_::
|
||||
Force Markdown when sending the current message.
|
||||
|
||||
*/cmark* _<message>_::
|
||||
Disables most of our extensions to cmark (CommonMark), including the
|
||||
newline-in-input = newline-in-output behaviour, strikethrough and spoilers. You
|
||||
may still force newlines with 2 spaces or a backslash before the line ending or
|
||||
insert HTML elements.
|
||||
|
||||
*/plain* _<message>_::
|
||||
Force plain text when sending the current message.
|
||||
|
||||
|
@ -233,6 +259,19 @@ Converts a room to a direct conversation.
|
|||
*/converttoroom*::
|
||||
Converts a direct conversation to a normal room.
|
||||
|
||||
== MARKDOWN EXTENSIONS
|
||||
|
||||
*newline (+\n+)*::
|
||||
A single newline will be turned into `<br>` instead of a space.
|
||||
|
||||
*+~~text~~+*::
|
||||
Make text strikethrough. HTML putput: `<del>text</del>`
|
||||
|
||||
*`||spoiler warning|text||`*::
|
||||
Hide text and set an optional spoiler warning. Note that Nheko does not display
|
||||
the spoiler warning currently. HTML output:
|
||||
`<span data-mx-spoiler="spoiler">text</span>`
|
||||
|
||||
== FILES
|
||||
|
||||
*Configuration file*::
|
||||
|
|
|
@ -1,16 +1,6 @@
|
|||
#compdef nheko
|
||||
|
||||
_arguments '--help[Displays help on commandline options.]' \
|
||||
'-h[Displays help on commandline options.]' \
|
||||
'--help-all[Displays help including Qt specific options.]' \
|
||||
'--version[Displays version information.]' \
|
||||
'-v[Displays version information.]' \
|
||||
'--debug[Enables debug output.]' \
|
||||
'--profile[Create or select profile.]:profile:_nheko_select_profile' \
|
||||
'-p[Create or select profile.]:profile:_nheko_select_profile'
|
||||
|
||||
function _nheko_select_profile()
|
||||
{
|
||||
function _nheko_select_profile() {
|
||||
local -a profiles=(default)
|
||||
while read -r line; do
|
||||
[[ ${line} =~ '\\auth\\device_id' ]] && profiles+=(${line%%\\*})
|
||||
|
@ -18,6 +8,11 @@ function _nheko_select_profile()
|
|||
_values "profile" ${profiles}
|
||||
}
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# End:
|
||||
_arguments \
|
||||
{'(--help)-h','(-h)--help'}'[Displays help on commandline options.]' \
|
||||
--help-all'[Displays help including Qt specific options.]' \
|
||||
{'(--version)-v','(-v)--version'}'[Displays version information.]' \
|
||||
--debug'[Enables debug output.]' \
|
||||
{'(--log-level)-l','(-l)--log-level'}'[Set the global log level, or a comma-separated list of <component>=<level> pairs, or both.]' \
|
||||
{'(--log-type)-L','(-L)--log-type'}"[Set the log output type. A comma-separated list is allowed. The default is 'file,stderr'.]" \
|
||||
{'(--profile)-p','(-p)--profile'}'[Create or select profile.]':'profile':'_nheko_select_profile'
|
||||
|
|
After Width: | Height: | Size: 4.6 KiB |
|
@ -0,0 +1,49 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.0"
|
||||
width="32.000000pt"
|
||||
height="10.000000pt"
|
||||
viewBox="0 0 32.000000 10.000000"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
id="svg4"
|
||||
sodipodi:docname="confettiparticle.svg"
|
||||
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="pt"
|
||||
showgrid="false"
|
||||
inkscape:zoom="17.7"
|
||||
inkscape:cx="7.1751412"
|
||||
inkscape:cy="0.64971751"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<g
|
||||
transform="translate(0.000000,10.000000) scale(0.100000,-0.100000)"
|
||||
fill="#000000"
|
||||
stroke="none"
|
||||
id="g2" />
|
||||
<rect
|
||||
style="fill:#ffffff;stroke-width:0.75"
|
||||
id="rect307"
|
||||
width="32.033897"
|
||||
height="10"
|
||||
x="0"
|
||||
y="0" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
|
@ -1,13 +1,13 @@
|
|||
# emoji-test.txt
|
||||
# Date: 2021-08-26, 17:22:23 GMT
|
||||
# © 2021 Unicode®, Inc.
|
||||
# Date: 2022-08-12, 20:24:39 GMT
|
||||
# © 2022 Unicode®, Inc.
|
||||
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
|
||||
# For terms of use, see http://www.unicode.org/terms_of_use.html
|
||||
# For terms of use, see https://www.unicode.org/terms_of_use.html
|
||||
#
|
||||
# Emoji Keyboard/Display Test Data for UTS #51
|
||||
# Version: 14.0
|
||||
# Version: 15.0
|
||||
#
|
||||
# For documentation and usage, see http://www.unicode.org/reports/tr51
|
||||
# For documentation and usage, see https://www.unicode.org/reports/tr51
|
||||
#
|
||||
# This file provides data for testing which emoji forms should be in keyboards and which should also be displayed/processed.
|
||||
# Format: code points; status # emoji name
|
||||
|
@ -92,6 +92,7 @@
|
|||
1F62C ; fully-qualified # 😬 E1.0 grimacing face
|
||||
1F62E 200D 1F4A8 ; fully-qualified # 😮💨 E13.1 face exhaling
|
||||
1F925 ; fully-qualified # 🤥 E3.0 lying face
|
||||
1FAE8 ; fully-qualified # 🫨 E15.0 shaking face
|
||||
|
||||
# subgroup: face-sleepy
|
||||
1F60C ; fully-qualified # 😌 E0.6 relieved face
|
||||
|
@ -155,7 +156,7 @@
|
|||
|
||||
# subgroup: face-negative
|
||||
1F624 ; fully-qualified # 😤 E0.6 face with steam from nose
|
||||
1F621 ; fully-qualified # 😡 E0.6 pouting face
|
||||
1F621 ; fully-qualified # 😡 E0.6 enraged face
|
||||
1F620 ; fully-qualified # 😠 E0.6 angry face
|
||||
1F92C ; fully-qualified # 🤬 E5.0 face with symbols on mouth
|
||||
1F608 ; fully-qualified # 😈 E1.0 smiling face with horns
|
||||
|
@ -190,8 +191,7 @@
|
|||
1F649 ; fully-qualified # 🙉 E0.6 hear-no-evil monkey
|
||||
1F64A ; fully-qualified # 🙊 E0.6 speak-no-evil monkey
|
||||
|
||||
# subgroup: emotion
|
||||
1F48B ; fully-qualified # 💋 E0.6 kiss mark
|
||||
# subgroup: heart
|
||||
1F48C ; fully-qualified # 💌 E0.6 love letter
|
||||
1F498 ; fully-qualified # 💘 E0.6 heart with arrow
|
||||
1F49D ; fully-qualified # 💝 E0.6 heart with ribbon
|
||||
|
@ -210,14 +210,20 @@
|
|||
2764 200D 1FA79 ; unqualified # ❤🩹 E13.1 mending heart
|
||||
2764 FE0F ; fully-qualified # ❤️ E0.6 red heart
|
||||
2764 ; unqualified # ❤ E0.6 red heart
|
||||
1FA77 ; fully-qualified # 🩷 E15.0 pink heart
|
||||
1F9E1 ; fully-qualified # 🧡 E5.0 orange heart
|
||||
1F49B ; fully-qualified # 💛 E0.6 yellow heart
|
||||
1F49A ; fully-qualified # 💚 E0.6 green heart
|
||||
1F499 ; fully-qualified # 💙 E0.6 blue heart
|
||||
1FA75 ; fully-qualified # 🩵 E15.0 light blue heart
|
||||
1F49C ; fully-qualified # 💜 E0.6 purple heart
|
||||
1F90E ; fully-qualified # 🤎 E12.0 brown heart
|
||||
1F5A4 ; fully-qualified # 🖤 E3.0 black heart
|
||||
1FA76 ; fully-qualified # 🩶 E15.0 grey heart
|
||||
1F90D ; fully-qualified # 🤍 E12.0 white heart
|
||||
|
||||
# subgroup: emotion
|
||||
1F48B ; fully-qualified # 💋 E0.6 kiss mark
|
||||
1F4AF ; fully-qualified # 💯 E0.6 hundred points
|
||||
1F4A2 ; fully-qualified # 💢 E0.6 anger symbol
|
||||
1F4A5 ; fully-qualified # 💥 E0.6 collision
|
||||
|
@ -226,21 +232,20 @@
|
|||
1F4A8 ; fully-qualified # 💨 E0.6 dashing away
|
||||
1F573 FE0F ; fully-qualified # 🕳️ E0.7 hole
|
||||
1F573 ; unqualified # 🕳 E0.7 hole
|
||||
1F4A3 ; fully-qualified # 💣 E0.6 bomb
|
||||
1F4AC ; fully-qualified # 💬 E0.6 speech balloon
|
||||
1F441 FE0F 200D 1F5E8 FE0F ; fully-qualified # 👁️🗨️ E2.0 eye in speech bubble
|
||||
1F441 200D 1F5E8 FE0F ; unqualified # 👁🗨️ E2.0 eye in speech bubble
|
||||
1F441 FE0F 200D 1F5E8 ; unqualified # 👁️🗨 E2.0 eye in speech bubble
|
||||
1F441 FE0F 200D 1F5E8 ; minimally-qualified # 👁️🗨 E2.0 eye in speech bubble
|
||||
1F441 200D 1F5E8 ; unqualified # 👁🗨 E2.0 eye in speech bubble
|
||||
1F5E8 FE0F ; fully-qualified # 🗨️ E2.0 left speech bubble
|
||||
1F5E8 ; unqualified # 🗨 E2.0 left speech bubble
|
||||
1F5EF FE0F ; fully-qualified # 🗯️ E0.7 right anger bubble
|
||||
1F5EF ; unqualified # 🗯 E0.7 right anger bubble
|
||||
1F4AD ; fully-qualified # 💭 E1.0 thought balloon
|
||||
1F4A4 ; fully-qualified # 💤 E0.6 zzz
|
||||
1F4A4 ; fully-qualified # 💤 E0.6 ZZZ
|
||||
|
||||
# Smileys & Emotion subtotal: 177
|
||||
# Smileys & Emotion subtotal: 177 w/o modifiers
|
||||
# Smileys & Emotion subtotal: 180
|
||||
# Smileys & Emotion subtotal: 180 w/o modifiers
|
||||
|
||||
# group: People & Body
|
||||
|
||||
|
@ -300,6 +305,18 @@
|
|||
1FAF4 1F3FD ; fully-qualified # 🫴🏽 E14.0 palm up hand: medium skin tone
|
||||
1FAF4 1F3FE ; fully-qualified # 🫴🏾 E14.0 palm up hand: medium-dark skin tone
|
||||
1FAF4 1F3FF ; fully-qualified # 🫴🏿 E14.0 palm up hand: dark skin tone
|
||||
1FAF7 ; fully-qualified # 🫷 E15.0 leftwards pushing hand
|
||||
1FAF7 1F3FB ; fully-qualified # 🫷🏻 E15.0 leftwards pushing hand: light skin tone
|
||||
1FAF7 1F3FC ; fully-qualified # 🫷🏼 E15.0 leftwards pushing hand: medium-light skin tone
|
||||
1FAF7 1F3FD ; fully-qualified # 🫷🏽 E15.0 leftwards pushing hand: medium skin tone
|
||||
1FAF7 1F3FE ; fully-qualified # 🫷🏾 E15.0 leftwards pushing hand: medium-dark skin tone
|
||||
1FAF7 1F3FF ; fully-qualified # 🫷🏿 E15.0 leftwards pushing hand: dark skin tone
|
||||
1FAF8 ; fully-qualified # 🫸 E15.0 rightwards pushing hand
|
||||
1FAF8 1F3FB ; fully-qualified # 🫸🏻 E15.0 rightwards pushing hand: light skin tone
|
||||
1FAF8 1F3FC ; fully-qualified # 🫸🏼 E15.0 rightwards pushing hand: medium-light skin tone
|
||||
1FAF8 1F3FD ; fully-qualified # 🫸🏽 E15.0 rightwards pushing hand: medium skin tone
|
||||
1FAF8 1F3FE ; fully-qualified # 🫸🏾 E15.0 rightwards pushing hand: medium-dark skin tone
|
||||
1FAF8 1F3FF ; fully-qualified # 🫸🏿 E15.0 rightwards pushing hand: dark skin tone
|
||||
|
||||
# subgroup: hand-fingers-partial
|
||||
1F44C ; fully-qualified # 👌 E0.6 OK hand
|
||||
|
@ -473,11 +490,11 @@
|
|||
1F932 1F3FE ; fully-qualified # 🤲🏾 E5.0 palms up together: medium-dark skin tone
|
||||
1F932 1F3FF ; fully-qualified # 🤲🏿 E5.0 palms up together: dark skin tone
|
||||
1F91D ; fully-qualified # 🤝 E3.0 handshake
|
||||
1F91D 1F3FB ; fully-qualified # 🤝🏻 E3.0 handshake: light skin tone
|
||||
1F91D 1F3FC ; fully-qualified # 🤝🏼 E3.0 handshake: medium-light skin tone
|
||||
1F91D 1F3FD ; fully-qualified # 🤝🏽 E3.0 handshake: medium skin tone
|
||||
1F91D 1F3FE ; fully-qualified # 🤝🏾 E3.0 handshake: medium-dark skin tone
|
||||
1F91D 1F3FF ; fully-qualified # 🤝🏿 E3.0 handshake: dark skin tone
|
||||
1F91D 1F3FB ; fully-qualified # 🤝🏻 E14.0 handshake: light skin tone
|
||||
1F91D 1F3FC ; fully-qualified # 🤝🏼 E14.0 handshake: medium-light skin tone
|
||||
1F91D 1F3FD ; fully-qualified # 🤝🏽 E14.0 handshake: medium skin tone
|
||||
1F91D 1F3FE ; fully-qualified # 🤝🏾 E14.0 handshake: medium-dark skin tone
|
||||
1F91D 1F3FF ; fully-qualified # 🤝🏿 E14.0 handshake: dark skin tone
|
||||
1FAF1 1F3FB 200D 1FAF2 1F3FC ; fully-qualified # 🫱🏻🫲🏼 E14.0 handshake: light skin tone, medium-light skin tone
|
||||
1FAF1 1F3FB 200D 1FAF2 1F3FD ; fully-qualified # 🫱🏻🫲🏽 E14.0 handshake: light skin tone, medium skin tone
|
||||
1FAF1 1F3FB 200D 1FAF2 1F3FE ; fully-qualified # 🫱🏻🫲🏾 E14.0 handshake: light skin tone, medium-dark skin tone
|
||||
|
@ -1455,7 +1472,7 @@
|
|||
1F575 1F3FF ; fully-qualified # 🕵🏿 E2.0 detective: dark skin tone
|
||||
1F575 FE0F 200D 2642 FE0F ; fully-qualified # 🕵️♂️ E4.0 man detective
|
||||
1F575 200D 2642 FE0F ; unqualified # 🕵♂️ E4.0 man detective
|
||||
1F575 FE0F 200D 2642 ; unqualified # 🕵️♂ E4.0 man detective
|
||||
1F575 FE0F 200D 2642 ; minimally-qualified # 🕵️♂ E4.0 man detective
|
||||
1F575 200D 2642 ; unqualified # 🕵♂ E4.0 man detective
|
||||
1F575 1F3FB 200D 2642 FE0F ; fully-qualified # 🕵🏻♂️ E4.0 man detective: light skin tone
|
||||
1F575 1F3FB 200D 2642 ; minimally-qualified # 🕵🏻♂ E4.0 man detective: light skin tone
|
||||
|
@ -1469,7 +1486,7 @@
|
|||
1F575 1F3FF 200D 2642 ; minimally-qualified # 🕵🏿♂ E4.0 man detective: dark skin tone
|
||||
1F575 FE0F 200D 2640 FE0F ; fully-qualified # 🕵️♀️ E4.0 woman detective
|
||||
1F575 200D 2640 FE0F ; unqualified # 🕵♀️ E4.0 woman detective
|
||||
1F575 FE0F 200D 2640 ; unqualified # 🕵️♀ E4.0 woman detective
|
||||
1F575 FE0F 200D 2640 ; minimally-qualified # 🕵️♀ E4.0 woman detective
|
||||
1F575 200D 2640 ; unqualified # 🕵♀ E4.0 woman detective
|
||||
1F575 1F3FB 200D 2640 FE0F ; fully-qualified # 🕵🏻♀️ E4.0 woman detective: light skin tone
|
||||
1F575 1F3FB 200D 2640 ; minimally-qualified # 🕵🏻♀ E4.0 woman detective: light skin tone
|
||||
|
@ -2302,7 +2319,7 @@
|
|||
1F3CC 1F3FF ; fully-qualified # 🏌🏿 E4.0 person golfing: dark skin tone
|
||||
1F3CC FE0F 200D 2642 FE0F ; fully-qualified # 🏌️♂️ E4.0 man golfing
|
||||
1F3CC 200D 2642 FE0F ; unqualified # 🏌♂️ E4.0 man golfing
|
||||
1F3CC FE0F 200D 2642 ; unqualified # 🏌️♂ E4.0 man golfing
|
||||
1F3CC FE0F 200D 2642 ; minimally-qualified # 🏌️♂ E4.0 man golfing
|
||||
1F3CC 200D 2642 ; unqualified # 🏌♂ E4.0 man golfing
|
||||
1F3CC 1F3FB 200D 2642 FE0F ; fully-qualified # 🏌🏻♂️ E4.0 man golfing: light skin tone
|
||||
1F3CC 1F3FB 200D 2642 ; minimally-qualified # 🏌🏻♂ E4.0 man golfing: light skin tone
|
||||
|
@ -2316,7 +2333,7 @@
|
|||
1F3CC 1F3FF 200D 2642 ; minimally-qualified # 🏌🏿♂ E4.0 man golfing: dark skin tone
|
||||
1F3CC FE0F 200D 2640 FE0F ; fully-qualified # 🏌️♀️ E4.0 woman golfing
|
||||
1F3CC 200D 2640 FE0F ; unqualified # 🏌♀️ E4.0 woman golfing
|
||||
1F3CC FE0F 200D 2640 ; unqualified # 🏌️♀ E4.0 woman golfing
|
||||
1F3CC FE0F 200D 2640 ; minimally-qualified # 🏌️♀ E4.0 woman golfing
|
||||
1F3CC 200D 2640 ; unqualified # 🏌♀ E4.0 woman golfing
|
||||
1F3CC 1F3FB 200D 2640 FE0F ; fully-qualified # 🏌🏻♀️ E4.0 woman golfing: light skin tone
|
||||
1F3CC 1F3FB 200D 2640 ; minimally-qualified # 🏌🏻♀ E4.0 woman golfing: light skin tone
|
||||
|
@ -2427,7 +2444,7 @@
|
|||
26F9 1F3FF ; fully-qualified # ⛹🏿 E2.0 person bouncing ball: dark skin tone
|
||||
26F9 FE0F 200D 2642 FE0F ; fully-qualified # ⛹️♂️ E4.0 man bouncing ball
|
||||
26F9 200D 2642 FE0F ; unqualified # ⛹♂️ E4.0 man bouncing ball
|
||||
26F9 FE0F 200D 2642 ; unqualified # ⛹️♂ E4.0 man bouncing ball
|
||||
26F9 FE0F 200D 2642 ; minimally-qualified # ⛹️♂ E4.0 man bouncing ball
|
||||
26F9 200D 2642 ; unqualified # ⛹♂ E4.0 man bouncing ball
|
||||
26F9 1F3FB 200D 2642 FE0F ; fully-qualified # ⛹🏻♂️ E4.0 man bouncing ball: light skin tone
|
||||
26F9 1F3FB 200D 2642 ; minimally-qualified # ⛹🏻♂ E4.0 man bouncing ball: light skin tone
|
||||
|
@ -2441,7 +2458,7 @@
|
|||
26F9 1F3FF 200D 2642 ; minimally-qualified # ⛹🏿♂ E4.0 man bouncing ball: dark skin tone
|
||||
26F9 FE0F 200D 2640 FE0F ; fully-qualified # ⛹️♀️ E4.0 woman bouncing ball
|
||||
26F9 200D 2640 FE0F ; unqualified # ⛹♀️ E4.0 woman bouncing ball
|
||||
26F9 FE0F 200D 2640 ; unqualified # ⛹️♀ E4.0 woman bouncing ball
|
||||
26F9 FE0F 200D 2640 ; minimally-qualified # ⛹️♀ E4.0 woman bouncing ball
|
||||
26F9 200D 2640 ; unqualified # ⛹♀ E4.0 woman bouncing ball
|
||||
26F9 1F3FB 200D 2640 FE0F ; fully-qualified # ⛹🏻♀️ E4.0 woman bouncing ball: light skin tone
|
||||
26F9 1F3FB 200D 2640 ; minimally-qualified # ⛹🏻♀ E4.0 woman bouncing ball: light skin tone
|
||||
|
@ -2462,7 +2479,7 @@
|
|||
1F3CB 1F3FF ; fully-qualified # 🏋🏿 E2.0 person lifting weights: dark skin tone
|
||||
1F3CB FE0F 200D 2642 FE0F ; fully-qualified # 🏋️♂️ E4.0 man lifting weights
|
||||
1F3CB 200D 2642 FE0F ; unqualified # 🏋♂️ E4.0 man lifting weights
|
||||
1F3CB FE0F 200D 2642 ; unqualified # 🏋️♂ E4.0 man lifting weights
|
||||
1F3CB FE0F 200D 2642 ; minimally-qualified # 🏋️♂ E4.0 man lifting weights
|
||||
1F3CB 200D 2642 ; unqualified # 🏋♂ E4.0 man lifting weights
|
||||
1F3CB 1F3FB 200D 2642 FE0F ; fully-qualified # 🏋🏻♂️ E4.0 man lifting weights: light skin tone
|
||||
1F3CB 1F3FB 200D 2642 ; minimally-qualified # 🏋🏻♂ E4.0 man lifting weights: light skin tone
|
||||
|
@ -2476,7 +2493,7 @@
|
|||
1F3CB 1F3FF 200D 2642 ; minimally-qualified # 🏋🏿♂ E4.0 man lifting weights: dark skin tone
|
||||
1F3CB FE0F 200D 2640 FE0F ; fully-qualified # 🏋️♀️ E4.0 woman lifting weights
|
||||
1F3CB 200D 2640 FE0F ; unqualified # 🏋♀️ E4.0 woman lifting weights
|
||||
1F3CB FE0F 200D 2640 ; unqualified # 🏋️♀ E4.0 woman lifting weights
|
||||
1F3CB FE0F 200D 2640 ; minimally-qualified # 🏋️♀ E4.0 woman lifting weights
|
||||
1F3CB 200D 2640 ; unqualified # 🏋♀ E4.0 woman lifting weights
|
||||
1F3CB 1F3FB 200D 2640 FE0F ; fully-qualified # 🏋🏻♀️ E4.0 woman lifting weights: light skin tone
|
||||
1F3CB 1F3FB 200D 2640 ; minimally-qualified # 🏋🏻♀ E4.0 woman lifting weights: light skin tone
|
||||
|
@ -3262,8 +3279,8 @@
|
|||
1FAC2 ; fully-qualified # 🫂 E13.0 people hugging
|
||||
1F463 ; fully-qualified # 👣 E0.6 footprints
|
||||
|
||||
# People & Body subtotal: 2986
|
||||
# People & Body subtotal: 506 w/o modifiers
|
||||
# People & Body subtotal: 2998
|
||||
# People & Body subtotal: 508 w/o modifiers
|
||||
|
||||
# group: Component
|
||||
|
||||
|
@ -3306,6 +3323,8 @@
|
|||
1F405 ; fully-qualified # 🐅 E1.0 tiger
|
||||
1F406 ; fully-qualified # 🐆 E1.0 leopard
|
||||
1F434 ; fully-qualified # 🐴 E0.6 horse face
|
||||
1FACE ; fully-qualified # 🫎 E15.0 moose
|
||||
1FACF ; fully-qualified # 🫏 E15.0 donkey
|
||||
1F40E ; fully-qualified # 🐎 E0.6 horse
|
||||
1F984 ; fully-qualified # 🦄 E1.0 unicorn
|
||||
1F993 ; fully-qualified # 🦓 E5.0 zebra
|
||||
|
@ -3373,6 +3392,9 @@
|
|||
1F9A9 ; fully-qualified # 🦩 E12.0 flamingo
|
||||
1F99A ; fully-qualified # 🦚 E11.0 peacock
|
||||
1F99C ; fully-qualified # 🦜 E11.0 parrot
|
||||
1FABD ; fully-qualified # 🪽 E15.0 wing
|
||||
1F426 200D 2B1B ; fully-qualified # 🐦⬛ E15.0 black bird
|
||||
1FABF ; fully-qualified # 🪿 E15.0 goose
|
||||
|
||||
# subgroup: animal-amphibian
|
||||
1F438 ; fully-qualified # 🐸 E0.6 frog
|
||||
|
@ -3399,6 +3421,7 @@
|
|||
1F419 ; fully-qualified # 🐙 E0.6 octopus
|
||||
1F41A ; fully-qualified # 🐚 E0.6 spiral shell
|
||||
1FAB8 ; fully-qualified # 🪸 E14.0 coral
|
||||
1FABC ; fully-qualified # 🪼 E15.0 jellyfish
|
||||
|
||||
# subgroup: animal-bug
|
||||
1F40C ; fully-qualified # 🐌 E0.6 snail
|
||||
|
@ -3433,6 +3456,7 @@
|
|||
1F33B ; fully-qualified # 🌻 E0.6 sunflower
|
||||
1F33C ; fully-qualified # 🌼 E0.6 blossom
|
||||
1F337 ; fully-qualified # 🌷 E0.6 tulip
|
||||
1FABB ; fully-qualified # 🪻 E15.0 hyacinth
|
||||
|
||||
# subgroup: plant-other
|
||||
1F331 ; fully-qualified # 🌱 E0.6 seedling
|
||||
|
@ -3451,9 +3475,10 @@
|
|||
1F343 ; fully-qualified # 🍃 E0.6 leaf fluttering in wind
|
||||
1FAB9 ; fully-qualified # 🪹 E14.0 empty nest
|
||||
1FABA ; fully-qualified # 🪺 E14.0 nest with eggs
|
||||
1F344 ; fully-qualified # 🍄 E0.6 mushroom
|
||||
|
||||
# Animals & Nature subtotal: 151
|
||||
# Animals & Nature subtotal: 151 w/o modifiers
|
||||
# Animals & Nature subtotal: 159
|
||||
# Animals & Nature subtotal: 159 w/o modifiers
|
||||
|
||||
# group: Food & Drink
|
||||
|
||||
|
@ -3492,10 +3517,11 @@
|
|||
1F966 ; fully-qualified # 🥦 E5.0 broccoli
|
||||
1F9C4 ; fully-qualified # 🧄 E12.0 garlic
|
||||
1F9C5 ; fully-qualified # 🧅 E12.0 onion
|
||||
1F344 ; fully-qualified # 🍄 E0.6 mushroom
|
||||
1F95C ; fully-qualified # 🥜 E3.0 peanuts
|
||||
1FAD8 ; fully-qualified # 🫘 E14.0 beans
|
||||
1F330 ; fully-qualified # 🌰 E0.6 chestnut
|
||||
1FADA ; fully-qualified # 🫚 E15.0 ginger root
|
||||
1FADB ; fully-qualified # 🫛 E15.0 pea pod
|
||||
|
||||
# subgroup: food-prepared
|
||||
1F35E ; fully-qualified # 🍞 E0.6 bread
|
||||
|
@ -3607,8 +3633,8 @@
|
|||
1FAD9 ; fully-qualified # 🫙 E14.0 jar
|
||||
1F3FA ; fully-qualified # 🏺 E1.0 amphora
|
||||
|
||||
# Food & Drink subtotal: 134
|
||||
# Food & Drink subtotal: 134 w/o modifiers
|
||||
# Food & Drink subtotal: 135
|
||||
# Food & Drink subtotal: 135 w/o modifiers
|
||||
|
||||
# group: Travel & Places
|
||||
|
||||
|
@ -3974,11 +4000,10 @@
|
|||
1F3AF ; fully-qualified # 🎯 E0.6 bullseye
|
||||
1FA80 ; fully-qualified # 🪀 E12.0 yo-yo
|
||||
1FA81 ; fully-qualified # 🪁 E12.0 kite
|
||||
1F52B ; fully-qualified # 🔫 E0.6 water pistol
|
||||
1F3B1 ; fully-qualified # 🎱 E0.6 pool 8 ball
|
||||
1F52E ; fully-qualified # 🔮 E0.6 crystal ball
|
||||
1FA84 ; fully-qualified # 🪄 E13.0 magic wand
|
||||
1F9FF ; fully-qualified # 🧿 E11.0 nazar amulet
|
||||
1FAAC ; fully-qualified # 🪬 E14.0 hamsa
|
||||
1F3AE ; fully-qualified # 🎮 E0.6 video game
|
||||
1F579 FE0F ; fully-qualified # 🕹️ E0.7 joystick
|
||||
1F579 ; unqualified # 🕹 E0.7 joystick
|
||||
|
@ -4013,8 +4038,8 @@
|
|||
1F9F6 ; fully-qualified # 🧶 E11.0 yarn
|
||||
1FAA2 ; fully-qualified # 🪢 E13.0 knot
|
||||
|
||||
# Activities subtotal: 97
|
||||
# Activities subtotal: 97 w/o modifiers
|
||||
# Activities subtotal: 96
|
||||
# Activities subtotal: 96 w/o modifiers
|
||||
|
||||
# group: Objects
|
||||
|
||||
|
@ -4040,6 +4065,7 @@
|
|||
1FA73 ; fully-qualified # 🩳 E12.0 shorts
|
||||
1F459 ; fully-qualified # 👙 E0.6 bikini
|
||||
1F45A ; fully-qualified # 👚 E0.6 woman’s clothes
|
||||
1FAAD ; fully-qualified # 🪭 E15.0 folding hand fan
|
||||
1F45B ; fully-qualified # 👛 E0.6 purse
|
||||
1F45C ; fully-qualified # 👜 E0.6 handbag
|
||||
1F45D ; fully-qualified # 👝 E0.6 clutch bag
|
||||
|
@ -4055,6 +4081,7 @@
|
|||
1F461 ; fully-qualified # 👡 E0.6 woman’s sandal
|
||||
1FA70 ; fully-qualified # 🩰 E12.0 ballet shoes
|
||||
1F462 ; fully-qualified # 👢 E0.6 woman’s boot
|
||||
1FAAE ; fully-qualified # 🪮 E15.0 hair pick
|
||||
1F451 ; fully-qualified # 👑 E0.6 crown
|
||||
1F452 ; fully-qualified # 👒 E0.6 woman’s hat
|
||||
1F3A9 ; fully-qualified # 🎩 E0.6 top hat
|
||||
|
@ -4103,6 +4130,8 @@
|
|||
1FA95 ; fully-qualified # 🪕 E12.0 banjo
|
||||
1F941 ; fully-qualified # 🥁 E3.0 drum
|
||||
1FA98 ; fully-qualified # 🪘 E13.0 long drum
|
||||
1FA87 ; fully-qualified # 🪇 E15.0 maracas
|
||||
1FA88 ; fully-qualified # 🪈 E15.0 flute
|
||||
|
||||
# subgroup: phone
|
||||
1F4F1 ; fully-qualified # 📱 E0.6 mobile phone
|
||||
|
@ -4275,7 +4304,7 @@
|
|||
1F5E1 ; unqualified # 🗡 E0.7 dagger
|
||||
2694 FE0F ; fully-qualified # ⚔️ E1.0 crossed swords
|
||||
2694 ; unqualified # ⚔ E1.0 crossed swords
|
||||
1F52B ; fully-qualified # 🔫 E0.6 water pistol
|
||||
1F4A3 ; fully-qualified # 💣 E0.6 bomb
|
||||
1FA83 ; fully-qualified # 🪃 E13.0 boomerang
|
||||
1F3F9 ; fully-qualified # 🏹 E1.0 bow and arrow
|
||||
1F6E1 FE0F ; fully-qualified # 🛡️ E0.7 shield
|
||||
|
@ -4354,12 +4383,14 @@
|
|||
1FAA6 ; fully-qualified # 🪦 E13.0 headstone
|
||||
26B1 FE0F ; fully-qualified # ⚱️ E1.0 funeral urn
|
||||
26B1 ; unqualified # ⚱ E1.0 funeral urn
|
||||
1F9FF ; fully-qualified # 🧿 E11.0 nazar amulet
|
||||
1FAAC ; fully-qualified # 🪬 E14.0 hamsa
|
||||
1F5FF ; fully-qualified # 🗿 E0.6 moai
|
||||
1FAA7 ; fully-qualified # 🪧 E13.0 placard
|
||||
1FAAA ; fully-qualified # 🪪 E14.0 identification card
|
||||
|
||||
# Objects subtotal: 304
|
||||
# Objects subtotal: 304 w/o modifiers
|
||||
# Objects subtotal: 310
|
||||
# Objects subtotal: 310 w/o modifiers
|
||||
|
||||
# group: Symbols
|
||||
|
||||
|
@ -4455,6 +4486,7 @@
|
|||
262E ; unqualified # ☮ E1.0 peace symbol
|
||||
1F54E ; fully-qualified # 🕎 E1.0 menorah
|
||||
1F52F ; fully-qualified # 🔯 E0.6 dotted six-pointed star
|
||||
1FAAF ; fully-qualified # 🪯 E15.0 khanda
|
||||
|
||||
# subgroup: zodiac
|
||||
2648 ; fully-qualified # ♈ E0.6 Aries
|
||||
|
@ -4503,6 +4535,7 @@
|
|||
1F505 ; fully-qualified # 🔅 E1.0 dim button
|
||||
1F506 ; fully-qualified # 🔆 E1.0 bright button
|
||||
1F4F6 ; fully-qualified # 📶 E0.6 antenna bars
|
||||
1F6DC ; fully-qualified # 🛜 E15.0 wireless
|
||||
1F4F3 ; fully-qualified # 📳 E0.6 vibration mode
|
||||
1F4F4 ; fully-qualified # 📴 E0.6 mobile phone off
|
||||
|
||||
|
@ -4693,8 +4726,8 @@
|
|||
1F533 ; fully-qualified # 🔳 E0.6 white square button
|
||||
1F532 ; fully-qualified # 🔲 E0.6 black square button
|
||||
|
||||
# Symbols subtotal: 302
|
||||
# Symbols subtotal: 302 w/o modifiers
|
||||
# Symbols subtotal: 304
|
||||
# Symbols subtotal: 304 w/o modifiers
|
||||
|
||||
# group: Flags
|
||||
|
||||
|
@ -4709,7 +4742,7 @@
|
|||
1F3F3 200D 1F308 ; unqualified # 🏳🌈 E4.0 rainbow flag
|
||||
1F3F3 FE0F 200D 26A7 FE0F ; fully-qualified # 🏳️⚧️ E13.0 transgender flag
|
||||
1F3F3 200D 26A7 FE0F ; unqualified # 🏳⚧️ E13.0 transgender flag
|
||||
1F3F3 FE0F 200D 26A7 ; unqualified # 🏳️⚧ E13.0 transgender flag
|
||||
1F3F3 FE0F 200D 26A7 ; minimally-qualified # 🏳️⚧ E13.0 transgender flag
|
||||
1F3F3 200D 26A7 ; unqualified # 🏳⚧ E13.0 transgender flag
|
||||
1F3F4 200D 2620 FE0F ; fully-qualified # 🏴☠️ E11.0 pirate flag
|
||||
1F3F4 200D 2620 ; minimally-qualified # 🏴☠ E11.0 pirate flag
|
||||
|
@ -4983,9 +5016,9 @@
|
|||
# Flags subtotal: 275 w/o modifiers
|
||||
|
||||
# Status Counts
|
||||
# fully-qualified : 3624
|
||||
# minimally-qualified : 817
|
||||
# unqualified : 252
|
||||
# fully-qualified : 3655
|
||||
# minimally-qualified : 827
|
||||
# unqualified : 242
|
||||
# component : 9
|
||||
|
||||
#EOF
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M3.28 2.22a.75.75 0 1 0-1.06 1.06l2.788 2.788a3.3 3.3 0 0 0-.005.181v14.996a.75.75 0 0 0 1.188.609L12 17.673l5.812 4.18A.75.75 0 0 0 19 21.246v-1.183l1.718 1.718a.75.75 0 0 0 1.061-1.06L3.28 2.22Zm14.221 16.342v1.22L12.44 16.14a.75.75 0 0 0-.876 0l-5.061 3.642V7.563L17.5 18.562ZM17.501 6.25v8.07l1.5 1.5V6.25A3.25 3.25 0 0 0 15.751 3H8.253c-.595 0-1.153.16-1.633.438l1.133 1.133a1.75 1.75 0 0 1 .5-.072h7.498c.967 0 1.75.784 1.75 1.75Z" fill="#212121"/></svg>
|
After Width: | Height: | Size: 564 B |
|
@ -0,0 +1 @@
|
|||
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6.19 21.854a.75.75 0 0 1-1.188-.61V6.25a3.25 3.25 0 0 1 3.25-3.25h7.499A3.25 3.25 0 0 1 19 6.249v14.996a.75.75 0 0 1-1.188.609l-5.811-4.181-5.812 4.18ZM17.5 6.249a1.75 1.75 0 0 0-1.75-1.75H8.253a1.75 1.75 0 0 0-1.75 1.75v13.532l5.062-3.64a.75.75 0 0 1 .876 0l5.06 3.64V6.25Z" fill="#212121"/></svg>
|
After Width: | Height: | Size: 403 B |
|
@ -0,0 +1,4 @@
|
|||
<svg width="96" height="96" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7 18h13a.75.75 0 0 1 .102 1.493L20 19.5H7a.75.75 0 0 1-.102-1.493L7 18Zm10-3a.75.75 0 0 1 .102 1.493L17 16.5H4a.75.75 0 0 1-.102-1.493L4 15h13Zm3-3a.75.75 0 0 1 .102 1.493L20 13.5H7a.75.75 0 0 1-.102-1.493L7 12h13ZM6 5a2.75 2.75 0 0 1 2.55 1.717.75.75 0 0 1-1.346.655l-.045-.091A1.25 1.25 0 1 0 6 9h11.5a.75.75 0 0 1 .102 1.493l-.102.007H6A2.75 2.75 0 0 1 6 5Zm14 1a.75.75 0 0 1 .102 1.493L20 7.5h-9a.75.75 0 0 1-.102-1.493L11 6h9Z" fill="#212121"/>
|
||||
<path d="m3.2035 3.2035c0.29289-0.2929 0.76777-0.2929 1.0607 0 16.532 16.532 0 0 16.532 16.532 0.29295 0.29288 0.29295 0.76778 0 1.0606-0.29288 0.29288-0.7677 0.29288-1.0606 0-16.532-16.532-0.11015-0.11011-16.532-16.532-0.2929-0.29289-0.2929-0.76777 1e-7 -1.0607z" fill="#212121" stroke-width=".75"/>
|
||||
</svg>
|
After Width: | Height: | Size: 868 B |
|
@ -0,0 +1,6 @@
|
|||
<svg width="32" height="32" version="1.1" viewBox="0 0 8.4667 8.4667" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="rotate(17.066 .26297 6.1037)" stroke="#000" stroke-linejoin="round">
|
||||
<path d="m1.0583 0.26458c-0.79375 0-0.79375 0.79375-0.79375 0.79375l0.79375 6.35 0.79375-6.35s-9e-7 -0.79375-0.79375-0.79375zm0 0.26458a0.52917 0.52917 0 0 1 0.52917 0.52917 0.52917 0.52917 0 0 1-0.52917 0.52917 0.52917 0.52917 0 0 1-0.52917-0.52917 0.52917 0.52917 0 0 1 0.52917-0.52917z" fill-rule="evenodd" stroke-width=".026458"/>
|
||||
<path d="m1.0583 1.0583s4.4594-1.5552 5.2917 0c0.60018 1.1215-2.242 1.9092-2.1167 3.175 0.049161 0.49648 1.0583 0.55943 1.0583 1.0583s-1.0583 1.0583-1.0583 1.0583" fill="none" stroke-linecap="round" stroke-width=".52917"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 765 B |
|
@ -0,0 +1 @@
|
|||
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M17.5 12a5.5 5.5 0 1 1 0 11 5.5 5.5 0 0 1 0-11Zm0 2-.09.007a.5.5 0 0 0-.402.402L17 14.5V17L14.498 17l-.09.008a.5.5 0 0 0-.402.402l-.008.09.008.09a.5.5 0 0 0 .402.402l.09.008H17v2.503l.008.09a.5.5 0 0 0 .402.402l.09.008.09-.008a.5.5 0 0 0 .402-.402l.008-.09V18l2.504.001.09-.008a.5.5 0 0 0 .402-.402l.008-.09-.008-.09a.5.5 0 0 0-.403-.402l-.09-.008H18v-2.5l-.008-.09a.5.5 0 0 0-.402-.403L17.5 14Zm-6.481 4c.04.519.14 1.021.294 1.5H7a.75.75 0 0 1-.102-1.493L7 18h4.019Zm.479-3c-.198.475-.34.977-.422 1.5H4a.75.75 0 0 1-.102-1.493L4 15h7.498Zm2.537-3a6.534 6.534 0 0 0-1.659 1.5H7a.75.75 0 0 1-.102-1.493L7 12h7.035ZM6 5a2.75 2.75 0 0 1 2.55 1.717.75.75 0 0 1-1.346.655l-.045-.091A1.25 1.25 0 1 0 6 9h11.5a.75.75 0 0 1 .102 1.493l-.102.007H6A2.75 2.75 0 0 1 6 5Zm14 1a.75.75 0 0 1 .102 1.493L20 7.5h-9a.75.75 0 0 1-.102-1.493L11 6h9Z" fill="#212121"/></svg>
|
After Width: | Height: | Size: 958 B |
|
@ -0,0 +1 @@
|
|||
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M17.5 12a5.5 5.5 0 1 1 0 11 5.5 5.5 0 0 1 0-11ZM12 2c5.524 0 10.002 4.478 10.002 10.002 0 .263-.01.524-.03.782a6.507 6.507 0 0 0-1.475-1.052 8.501 8.501 0 1 0-8.765 8.767 6.5 6.5 0 0 0 1.05 1.474c-.257.02-.518.03-.782.03-5.524 0-10.002-4.478-10.002-10.001C1.998 6.477 6.476 1.999 12 1.999Zm5.5 12-.09.008a.5.5 0 0 0-.402.402L17 14.5V17L14.498 17l-.09.008a.5.5 0 0 0-.402.402l-.008.09.008.09a.5.5 0 0 0 .402.402l.09.008H17v2.503l.008.09a.5.5 0 0 0 .402.402l.09.008.09-.008a.5.5 0 0 0 .402-.402l.008-.09V18l2.504.001.09-.008a.5.5 0 0 0 .402-.402l.008-.09-.008-.09a.5.5 0 0 0-.402-.402l-.09-.008H18v-2.5l-.008-.09a.5.5 0 0 0-.402-.403L17.5 14Zm-9.038.785a4.494 4.494 0 0 0 2.63 1.626 6.449 6.449 0 0 0-.079 1.51 5.983 5.983 0 0 1-3.73-2.208.75.75 0 0 1 1.179-.928ZM9 8.75a1.25 1.25 0 1 1 0 2.499A1.25 1.25 0 0 1 9 8.75Zm6 0a1.25 1.25 0 1 1 0 2.499 1.25 1.25 0 0 1 0-2.499Z" fill="#212121"/></svg>
|
After Width: | Height: | Size: 997 B |
|
@ -0,0 +1 @@
|
|||
<svg width="96" height="96" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M7 18h13a.75.75 0 0 1 .102 1.493L20 19.5H7a.75.75 0 0 1-.102-1.493L7 18Zm10-3a.75.75 0 0 1 .102 1.493L17 16.5H4a.75.75 0 0 1-.102-1.493L4 15h13Zm3-3a.75.75 0 0 1 .102 1.493L20 13.5H7a.75.75 0 0 1-.102-1.493L7 12h13ZM6 5a2.75 2.75 0 0 1 2.55 1.717.75.75 0 0 1-1.346.655l-.045-.091A1.25 1.25 0 1 0 6 9h11.5a.75.75 0 0 1 .102 1.493l-.102.007H6A2.75 2.75 0 0 1 6 5Zm14 1a.75.75 0 0 1 .102 1.493L20 7.5h-9a.75.75 0 0 1-.102-1.493L11 6h9Z" fill="#212121"/></svg>
|
After Width: | Height: | Size: 561 B |
|
@ -61,6 +61,10 @@
|
|||
<url type="homepage">https://github.com/Nheko-Reborn/nheko</url>
|
||||
<update_contact>https://github.com/Nheko-Reborn</update_contact>
|
||||
<releases>
|
||||
<release date="2023-02-23" version="0.11.3"/>
|
||||
<release date="2023-02-20" version="0.11.2"/>
|
||||
<release date="2023-01-15" version="0.11.1"/>
|
||||
<release date="2023-01-12" version="0.11.0"/>
|
||||
<release date="2022-09-28" version="0.10.2"/>
|
||||
<release date="2022-09-07" version="0.10.1"/>
|
||||
<release date="2022-07-22" version="0.10.0"/>
|
||||
|
|
|
@ -7,4 +7,12 @@
|
|||
|
||||
using namespace emoji;
|
||||
|
||||
// a null terminated string_view
|
||||
template<size_t N>
|
||||
static consteval std::u16string_view
|
||||
null_literal(const char16_t (&lit)[N])
|
||||
{
|
||||
return std::u16string_view(lit, N);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -24,8 +25,8 @@ AbstractButton {
|
|||
height: 48
|
||||
background: Rectangle {
|
||||
id: bg
|
||||
radius: Settings.avatarCircles ? height / 2 : height / 8
|
||||
color: Nheko.colors.alternateBase
|
||||
radius: Settings.avatarCircles ? height / 2 : 0
|
||||
color: Nheko.colors.dark
|
||||
}
|
||||
|
||||
Label {
|
||||
|
@ -48,7 +49,7 @@ AbstractButton {
|
|||
|
||||
anchors.fill: parent
|
||||
visible: Settings.useIdenticon && img.status != Image.Ready
|
||||
source: Settings.useIdenticon ? ("image://jdenticon/" + (userid !== "" ? userid : roomid) + "?radius=" + (Settings.avatarCircles ? 100 : 25)) : ""
|
||||
source: Settings.useIdenticon ? ("image://jdenticon/" + (userid !== "" ? userid : roomid) + "?radius=" + (Settings.avatarCircles ? 100 : 0)) : ""
|
||||
}
|
||||
|
||||
Image {
|
||||
|
@ -61,7 +62,7 @@ AbstractButton {
|
|||
smooth: true
|
||||
sourceSize.width: avatar.width * Screen.devicePixelRatio
|
||||
sourceSize.height: avatar.height * Screen.devicePixelRatio
|
||||
source: avatar.url ? (avatar.url + "?radius=" + (Settings.avatarCircles ? 100 : 25) + ((avatar.crop) ? "" : "&scale")) : ""
|
||||
source: avatar.url ? (avatar.url + "?radius=" + (Settings.avatarCircles ? 100 : 0) + ((avatar.crop) ? "" : "&scale")) : ""
|
||||
|
||||
}
|
||||
|
||||
|
@ -73,15 +74,15 @@ AbstractButton {
|
|||
visible: !!userid
|
||||
height: avatar.height / 6
|
||||
width: height
|
||||
radius: Settings.avatarCircles ? height / 2 : height / 8
|
||||
radius: Settings.avatarCircles ? height / 2 : 0
|
||||
color: updatePresence()
|
||||
|
||||
function updatePresence() {
|
||||
switch (Presence.userPresence(userid)) {
|
||||
case "online":
|
||||
return "#00cc66";
|
||||
return Nheko.theme.online;
|
||||
case "unavailable":
|
||||
return "#ff9933";
|
||||
return Nheko.theme.unavailable;
|
||||
case "offline":
|
||||
default:
|
||||
// return "#a82353" don't show anything if offline, since it is confusing, if presence is disabled
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -122,7 +123,7 @@ Rectangle {
|
|||
AdaptiveLayoutElement {
|
||||
id: timlineViewC
|
||||
|
||||
minimumWidth: fontMetrics.averageCharacterWidth * 40 + Nheko.avatarSize + 2 * Nheko.paddingMedium
|
||||
minimumWidth: fontMetrics.height/2 * 40 + Nheko.avatarSize + 2 * Nheko.paddingMedium
|
||||
|
||||
TimelineView {
|
||||
id: timeline
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -19,6 +20,14 @@ Page {
|
|||
property int avatarSize: Math.ceil(fontMetrics.lineSpacing * 1.6)
|
||||
property bool collapsed: false
|
||||
|
||||
// HACK: https://bugreports.qt.io/browse/QTBUG-83972, qtwayland cannot auto hide menu
|
||||
Connections {
|
||||
function onHideMenu() {
|
||||
communityContextMenu.close()
|
||||
}
|
||||
target: MainWindow
|
||||
}
|
||||
|
||||
ListView {
|
||||
id: communitiesList
|
||||
|
||||
|
@ -27,6 +36,11 @@ Page {
|
|||
height: parent.height
|
||||
model: Communities.filtered()
|
||||
|
||||
ScrollBar.vertical: ScrollBar {
|
||||
id: scrollbar
|
||||
parent: !collapsed && Settings.scrollbarsInRoomlist ? communitiesList : null
|
||||
}
|
||||
|
||||
ScrollHelper {
|
||||
flickable: parent
|
||||
anchors.fill: parent
|
||||
|
@ -48,14 +62,14 @@ Page {
|
|||
}
|
||||
|
||||
Platform.MenuItem {
|
||||
text: qsTr("Do not show notification counts for this space or tag.")
|
||||
text: qsTr("Do not show notification counts for this community or tag.")
|
||||
checkable: true
|
||||
checked: communityContextMenu.muted
|
||||
onTriggered: Communities.toggleTagMute(communityContextMenu.tagId)
|
||||
}
|
||||
|
||||
Platform.MenuItem {
|
||||
text: qsTr("Hide rooms with this tag or from this space by default.")
|
||||
text: qsTr("Hide rooms with this tag or from this community by default.")
|
||||
checkable: true
|
||||
checked: communityContextMenu.hidden
|
||||
onTriggered: Communities.toggleTagId(communityContextMenu.tagId)
|
||||
|
@ -74,7 +88,7 @@ Page {
|
|||
required property var model
|
||||
|
||||
height: avatarSize + 2 * Nheko.paddingMedium
|
||||
width: ListView.view.width
|
||||
width: ListView.view.width - ((scrollbar.interactive && scrollbar.visible && scrollbar.parent) ? scrollbar.width : 0)
|
||||
state: "normal"
|
||||
ToolTip.visible: hovered && collapsed
|
||||
ToolTip.text: model.tooltip
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -120,6 +121,9 @@ Control {
|
|||
pixelAligned: true
|
||||
highlightFollowsCurrentItem: true
|
||||
|
||||
displayMarginBeginning: height / 2
|
||||
displayMarginEnd: height / 2
|
||||
|
||||
delegate: Rectangle {
|
||||
property variant modelData: model
|
||||
|
||||
|
@ -209,6 +213,30 @@ Control {
|
|||
|
||||
}
|
||||
|
||||
DelegateChoice {
|
||||
roleValue: "command"
|
||||
|
||||
RowLayout {
|
||||
id: del
|
||||
|
||||
anchors.centerIn: parent
|
||||
spacing: rowSpacing
|
||||
|
||||
Label {
|
||||
text: model.name
|
||||
color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.text
|
||||
font.bold: true
|
||||
}
|
||||
|
||||
Label {
|
||||
text: model.description
|
||||
color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.buttonText
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
DelegateChoice {
|
||||
roleValue: "customEmoji"
|
||||
|
||||
|
@ -263,7 +291,7 @@ Control {
|
|||
Label {
|
||||
text: model.roomName
|
||||
font.pixelSize: popup.avatarHeight * 0.5
|
||||
color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.text
|
||||
color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.brightText
|
||||
textFormat: Text.RichText
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -15,7 +16,7 @@ Label {
|
|||
property int fullTextWidth: Math.ceil(metrics.advanceWidth)
|
||||
|
||||
color: Nheko.colors.text
|
||||
text: (textFormat == Text.PlainText) ? metrics.elidedText : TimelineManager.escapeEmoji(TimelineManager.htmlEscape(metrics.elidedText))
|
||||
text: (textFormat == Text.PlainText) ? metrics.elidedText : TimelineManager.escapeEmoji(metrics.elidedText)
|
||||
maximumLineCount: 1
|
||||
elide: Text.ElideRight
|
||||
textFormat: Text.PlainText
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -34,13 +35,13 @@ Image {
|
|||
|
||||
width: 16
|
||||
height: 16
|
||||
sourceSize.height: height * Screen.devicePixelRatio
|
||||
sourceSize.width: width * Screen.devicePixelRatio
|
||||
sourceSize.height: height
|
||||
sourceSize.width: width
|
||||
source: {
|
||||
if (encrypted) {
|
||||
switch (trust) {
|
||||
case Crypto.Verified:
|
||||
return sourceUrl + "green";
|
||||
return sourceUrl + Nheko.theme.green;
|
||||
case Crypto.TOFU:
|
||||
return sourceUrl + Nheko.colors.buttonText;
|
||||
default:
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -20,6 +21,7 @@ ColumnLayout {
|
|||
property alias font: input.font
|
||||
property alias echoMode: input.echoMode
|
||||
property alias selectByMouse: input.selectByMouse
|
||||
property var hasClear: false
|
||||
|
||||
Timer {
|
||||
id: timer
|
||||
|
@ -129,6 +131,26 @@ ColumnLayout {
|
|||
color: labelC.text ? "transparent" : backgroundColor
|
||||
}
|
||||
|
||||
ImageButton {
|
||||
id: clearText
|
||||
|
||||
visible: c.hasClear && searchField.text !== ''
|
||||
|
||||
image: ":/icons/icons/ui/round-remove-button.svg"
|
||||
focusPolicy: Qt.NoFocus
|
||||
onClicked: {
|
||||
searchField.clear()
|
||||
topBar.searchString = "";
|
||||
}
|
||||
hoverEnabled: true
|
||||
anchors {
|
||||
top: parent.top
|
||||
bottom: parent.bottom
|
||||
right: parent.right
|
||||
rightMargin: Nheko.paddingSmall
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -14,7 +15,7 @@ import im.nheko 1.0
|
|||
Rectangle {
|
||||
id: inputBar
|
||||
|
||||
color: Nheko.colors.window
|
||||
color: Nheko.colors.base
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: row.implicitHeight
|
||||
Layout.minimumHeight: 40
|
||||
|
@ -46,14 +47,14 @@ Rectangle {
|
|||
|
||||
ImageButton {
|
||||
visible: CallManager.callsSupported && showAllButtons
|
||||
opacity: CallManager.haveCallInvite ? 0.3 : 1
|
||||
opacity: (CallManager.haveCallInvite || CallManager.isOnCallOnOtherDevice) ? 0.3 : 1
|
||||
Layout.alignment: Qt.AlignBottom
|
||||
hoverEnabled: true
|
||||
width: 22
|
||||
height: 22
|
||||
image: CallManager.isOnCall ? ":/icons/icons/ui/end-call.svg" : ":/icons/icons/ui/place-call.svg"
|
||||
ToolTip.visible: hovered
|
||||
ToolTip.text: CallManager.isOnCall ? qsTr("Hang up") : qsTr("Place a call")
|
||||
ToolTip.text: CallManager.isOnCall ? qsTr("Hang up") : (CallManager.isOnCallOnOtherDevice ? qsTr("Already on a call") : qsTr("Place a call"))
|
||||
Layout.margins: 8
|
||||
onClicked: {
|
||||
if (room) {
|
||||
|
@ -61,7 +62,11 @@ Rectangle {
|
|||
return ;
|
||||
} else if (CallManager.isOnCall) {
|
||||
CallManager.hangUp();
|
||||
} else {
|
||||
}
|
||||
else if(CallManager.isOnCallOnOtherDevice) {
|
||||
return;
|
||||
}
|
||||
else {
|
||||
var dialog = placeCallDialog.createObject(timelineRoot);
|
||||
dialog.open();
|
||||
timelineRoot.destroyOnClose(dialog);
|
||||
|
@ -164,6 +169,8 @@ Rectangle {
|
|||
messageInput.openCompleter(selectionStart-1, "roomAliases");
|
||||
} else if (lastChar == "~") {
|
||||
messageInput.openCompleter(selectionStart-1, "customEmoji");
|
||||
} else if (lastChar == "/" && cursorPosition == 1) {
|
||||
messageInput.openCompleter(selectionStart-1, "command");
|
||||
}
|
||||
}
|
||||
onCursorPositionChanged: {
|
||||
|
@ -212,6 +219,11 @@ Rectangle {
|
|||
popup.close();
|
||||
} else if (event.matches(StandardKey.InsertLineSeparator)) {
|
||||
if (popup.opened) popup.close();
|
||||
|
||||
if (Settings.invertEnterKey && (!Qt.inputMethod.visible || Qt.platform.os === "windows")) {
|
||||
room.input.send();
|
||||
event.accepted = true;
|
||||
}
|
||||
} else if (event.matches(StandardKey.InsertParagraphSeparator)) {
|
||||
if (popup.opened) {
|
||||
var currentCompletion = completer.currentCompletion();
|
||||
|
@ -223,7 +235,7 @@ Rectangle {
|
|||
return;
|
||||
}
|
||||
}
|
||||
if (!Qt.inputMethod.visible) {
|
||||
if (!Settings.invertEnterKey && (!Qt.inputMethod.visible || Qt.platform.os === "windows")) {
|
||||
room.input.send();
|
||||
event.accepted = true;
|
||||
}
|
||||
|
@ -378,6 +390,10 @@ Rectangle {
|
|||
messageInput.forceActiveFocus();
|
||||
}
|
||||
|
||||
function onThreadChanged() {
|
||||
messageInput.forceActiveFocus();
|
||||
}
|
||||
|
||||
ignoreUnknownSignals: true
|
||||
target: room
|
||||
}
|
||||
|
@ -404,7 +420,7 @@ Rectangle {
|
|||
|
||||
ImageButton {
|
||||
id: stickerButton
|
||||
visible: showAllButtons
|
||||
visible: false
|
||||
|
||||
Layout.alignment: Qt.AlignRight | Qt.AlignBottom
|
||||
Layout.margins: 8
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -22,6 +23,17 @@ Item {
|
|||
|
||||
property int availableWidth: width
|
||||
|
||||
property string searchString: ""
|
||||
|
||||
// HACK: https://bugreports.qt.io/browse/QTBUG-83972, qtwayland cannot auto hide menu
|
||||
Connections {
|
||||
function onHideMenu() {
|
||||
messageContextMenu.close()
|
||||
replyContextMenu.close()
|
||||
}
|
||||
target: MainWindow
|
||||
}
|
||||
|
||||
ScrollBar {
|
||||
id: scrollbar
|
||||
parent: chat.parent
|
||||
|
@ -36,24 +48,34 @@ Item {
|
|||
|
||||
property int delegateMaxWidth: ((Settings.timelineMaxWidth > 100 && Settings.timelineMaxWidth < chatRoot.availableWidth) ? Settings.timelineMaxWidth : chatRoot.availableWidth) - chatRoot.padding * 2 - (scrollbar.interactive? scrollbar.width : 0)
|
||||
|
||||
readonly property alias filteringInProgress: filteredTimeline.filteringInProgress
|
||||
|
||||
displayMarginBeginning: height / 2
|
||||
displayMarginEnd: height / 2
|
||||
model: room
|
||||
|
||||
TimelineFilter {
|
||||
id: filteredTimeline
|
||||
source: room
|
||||
filterByThread: room ? room.thread : ""
|
||||
filterByContent: chatRoot.searchString
|
||||
}
|
||||
|
||||
model: (filteredTimeline.filterByThread || filteredTimeline.filterByContent) ? filteredTimeline : room
|
||||
// reuseItems still has a few bugs, see https://bugreports.qt.io/browse/QTBUG-95105 https://bugreports.qt.io/browse/QTBUG-95107
|
||||
//onModelChanged: if (room) room.sendReset()
|
||||
//reuseItems: true
|
||||
boundsBehavior: Flickable.StopAtBounds
|
||||
//pixelAligned: true
|
||||
spacing: 2
|
||||
spacing: 16
|
||||
verticalLayoutDirection: ListView.BottomToTop
|
||||
onCountChanged: {
|
||||
// Mark timeline as read
|
||||
if (atYEnd && room) model.currentIndex = 0;
|
||||
|
||||
}
|
||||
|
||||
ScrollBar.vertical: scrollbar
|
||||
|
||||
anchors.leftMargin: 16
|
||||
anchors.rightMargin: scrollbar.interactive? scrollbar.width : 0
|
||||
|
||||
Control {
|
||||
|
@ -75,7 +97,7 @@ Item {
|
|||
color: Nheko.colors.window
|
||||
border.color: Nheko.colors.buttonText
|
||||
border.width: 1
|
||||
radius: padding
|
||||
radius: 0
|
||||
}
|
||||
|
||||
contentItem: RowLayout {
|
||||
|
@ -91,7 +113,7 @@ Item {
|
|||
delegate: TextButton {
|
||||
required property string modelData
|
||||
|
||||
visible: chat.model ? chat.model.permissions.canSend(MtxEvent.Reaction) : false
|
||||
visible: room ? room.permissions.canSend(MtxEvent.Reaction) : false
|
||||
|
||||
Layout.preferredHeight: fontMetrics.height
|
||||
font.family: Settings.emojiFont
|
||||
|
@ -116,19 +138,17 @@ Item {
|
|||
ToolTip.delay: Nheko.tooltipDelay
|
||||
ToolTip.text: qsTr("Edit")
|
||||
onClicked: {
|
||||
if (row.model.isEditable)
|
||||
chat.model.editAction(row.model.eventId);
|
||||
|
||||
if (row.model.isEditable) room.edit = row.model.eventId;
|
||||
}
|
||||
}
|
||||
|
||||
ImageButton {
|
||||
id: reactButton
|
||||
|
||||
visible: chat.model ? chat.model.permissions.canSend(MtxEvent.Reaction) : false
|
||||
visible: room ? room.permissions.canSend(MtxEvent.Reaction) : false
|
||||
width: 16
|
||||
hoverEnabled: true
|
||||
image: ":/icons/icons/ui/smile.svg"
|
||||
image: ":/icons/icons/ui/smile-add.svg"
|
||||
ToolTip.visible: hovered
|
||||
ToolTip.delay: Nheko.tooltipDelay
|
||||
ToolTip.text: qsTr("React")
|
||||
|
@ -139,17 +159,30 @@ Item {
|
|||
})
|
||||
}
|
||||
|
||||
ImageButton {
|
||||
id: threadButton
|
||||
|
||||
visible: room ? room.permissions.canSend(MtxEvent.TextMessage) : false
|
||||
width: 16
|
||||
hoverEnabled: true
|
||||
image: (row.model && row.model.threadId) ? ":/icons/icons/ui/thread.svg" : ":/icons/icons/ui/new-thread.svg"
|
||||
ToolTip.visible: hovered
|
||||
ToolTip.delay: Nheko.tooltipDelay
|
||||
ToolTip.text: (row.model && row.model.threadId) ? qsTr("Reply in thread") : qsTr("New thread")
|
||||
onClicked: room.thread = (row.model.threadId || row.model.eventId)
|
||||
}
|
||||
|
||||
ImageButton {
|
||||
id: replyButton
|
||||
|
||||
visible: chat.model ? chat.model.permissions.canSend(MtxEvent.TextMessage) : false
|
||||
visible: room ? room.permissions.canSend(MtxEvent.TextMessage) : false
|
||||
width: 16
|
||||
hoverEnabled: true
|
||||
image: ":/icons/icons/ui/reply.svg"
|
||||
ToolTip.visible: hovered
|
||||
ToolTip.delay: Nheko.tooltipDelay
|
||||
ToolTip.text: qsTr("Reply")
|
||||
onClicked: chat.model.replyAction(row.model.eventId)
|
||||
onClicked: room.reply = row.model.eventId
|
||||
}
|
||||
|
||||
ImageButton {
|
||||
|
@ -161,7 +194,7 @@ Item {
|
|||
ToolTip.visible: hovered
|
||||
ToolTip.delay: Nheko.tooltipDelay
|
||||
ToolTip.text: qsTr("Options")
|
||||
onClicked: messageContextMenu.show(row.model.eventId, row.model.type, row.model.isSender, row.model.isEncrypted, row.model.isEditable, "", row.model.body, optionsButton)
|
||||
onClicked: messageContextMenu.show(row.model.eventId, row.model.threadId, row.model.type, row.model.isSender, row.model.isEncrypted, row.model.isEditable, "", row.model.body, optionsButton)
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -194,35 +227,39 @@ Item {
|
|||
onActivated: {
|
||||
if(room.input.uploads.length > 0)
|
||||
room.input.declineUploads();
|
||||
else if(chat.model.reply)
|
||||
chat.model.reply = undefined;
|
||||
else if(room.reply)
|
||||
room.reply = undefined;
|
||||
else if (room.edit)
|
||||
room.edit = undefined;
|
||||
else
|
||||
chat.model.edit = undefined;
|
||||
room.thread = undefined
|
||||
TimelineManager.focusMessageInput();
|
||||
}
|
||||
}
|
||||
|
||||
// These shortcuts use the room timeline because switching to threads and out is annoying otherwise.
|
||||
// Better solution welcome.
|
||||
Shortcut {
|
||||
sequence: "Alt+Up"
|
||||
onActivated: chat.model.reply = chat.model.indexToId(chat.model.reply ? chat.model.idToIndex(chat.model.reply) + 1 : 0)
|
||||
onActivated: room.reply = room.indexToId(room.reply ? room.idToIndex(room.reply) + 1 : 0)
|
||||
}
|
||||
|
||||
Shortcut {
|
||||
sequence: "Alt+Down"
|
||||
onActivated: {
|
||||
var idx = chat.model.reply ? chat.model.idToIndex(chat.model.reply) - 1 : -1;
|
||||
chat.model.reply = idx >= 0 ? chat.model.indexToId(idx) : null;
|
||||
var idx = room.reply ? room.idToIndex(room.reply) - 1 : -1;
|
||||
room.reply = idx >= 0 ? room.indexToId(idx) : null;
|
||||
}
|
||||
}
|
||||
|
||||
Shortcut {
|
||||
sequence: "Alt+F"
|
||||
onActivated: {
|
||||
if (chat.model.reply) {
|
||||
if (room.reply) {
|
||||
var forwardMess = forwardCompleterComponent.createObject(timelineRoot);
|
||||
forwardMess.setMessageEventId(chat.model.reply);
|
||||
forwardMess.setMessageEventId(room.reply);
|
||||
forwardMess.open();
|
||||
chat.model.reply = null;
|
||||
room.reply = null;
|
||||
timelineRoot.destroyOnClose(forwardMess);
|
||||
}
|
||||
}
|
||||
|
@ -231,7 +268,7 @@ Item {
|
|||
Shortcut {
|
||||
sequence: "Ctrl+E"
|
||||
onActivated: {
|
||||
chat.model.edit = chat.model.reply;
|
||||
room.edit = room.reply;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -242,8 +279,8 @@ Item {
|
|||
|
||||
// force current read index to update
|
||||
onTriggered: {
|
||||
if (chat.model)
|
||||
chat.model.setCurrentIndex(chat.model.currentIndex);
|
||||
if (room)
|
||||
room.setCurrentIndex(room.currentIndex);
|
||||
|
||||
}
|
||||
interval: 1000
|
||||
|
@ -266,15 +303,15 @@ Item {
|
|||
anchors.horizontalCenter: parent ? parent.horizontalCenter : undefined
|
||||
visible: room && previousMessageDay !== day
|
||||
text: room ? room.formatDateSeparator(timestamp) : ""
|
||||
color: Nheko.colors.text
|
||||
height: Math.round(fontMetrics.height * 1.4)
|
||||
color: Nheko.colors.brightText
|
||||
height: Math.round(fontMetrics.height * 2)
|
||||
width: contentWidth * 1.2
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
|
||||
background: Rectangle {
|
||||
radius: parent.height / 2
|
||||
color: Nheko.colors.window
|
||||
radius: 0
|
||||
color: Nheko.colors.base
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -301,14 +338,14 @@ Item {
|
|||
|
||||
Connections {
|
||||
function onRoomAvatarUrlChanged() {
|
||||
messageUserAvatar.url = chat.model.avatarUrl(userId).replace("mxc://", "image://MxcImage/");
|
||||
messageUserAvatar.url = room.avatarUrl(userId).replace("mxc://", "image://MxcImage/");
|
||||
}
|
||||
|
||||
function onScrollToIndex(index) {
|
||||
chat.positionViewAtIndex(index, ListView.Center);
|
||||
}
|
||||
|
||||
target: chat.model
|
||||
target: room
|
||||
}
|
||||
property int remainingWidth: chat.delegateMaxWidth - spacing - messageUserAvatar.width
|
||||
AbstractButton {
|
||||
|
@ -322,7 +359,7 @@ Item {
|
|||
ToolTip.visible: hovered
|
||||
ToolTip.delay: Nheko.tooltipDelay
|
||||
ToolTip.text: userId
|
||||
onClicked: chat.model.openUserProfile(userId)
|
||||
onClicked: room.openUserProfile(userId)
|
||||
leftInset: 0
|
||||
rightInset: 0
|
||||
leftPadding: 0
|
||||
|
@ -381,24 +418,26 @@ Item {
|
|||
required property bool isEditable
|
||||
required property bool isEdited
|
||||
required property bool isStateEvent
|
||||
required property bool previousMessageIsStateEvent
|
||||
property bool previousMessageIsStateEvent: (index + 1) >= chat.count ? true : chat.model.dataByIndex(index+1, Room.IsStateEvent)
|
||||
required property string replyTo
|
||||
required property string threadId
|
||||
required property string userId
|
||||
required property string roomTopic
|
||||
required property string roomName
|
||||
required property string callType
|
||||
required property var reactions
|
||||
required property int trustlevel
|
||||
required property int notificationlevel
|
||||
required property int encryptionError
|
||||
required property var timestamp
|
||||
required property int status
|
||||
required property int index
|
||||
required property int relatedEventCacheBuster
|
||||
required property string previousMessageUserId
|
||||
required property string day
|
||||
required property string previousMessageDay
|
||||
required property var day
|
||||
property string previousMessageUserId: (index + 1) >= chat.count ? "" : chat.model.dataByIndex(index+1, Room.UserId)
|
||||
property var previousMessageDay: (index + 1) >= chat.count ? 0 : chat.model.dataByIndex(index+1, Room.Day)
|
||||
required property string userName
|
||||
property bool scrolledToThis: eventId === chat.model.scrollTarget && (y + height > chat.y + chat.contentY && y < chat.y + chat.height + chat.contentY)
|
||||
property bool scrolledToThis: eventId === room.scrollTarget && (y + height > chat.y + chat.contentY && y < chat.y + chat.height + chat.contentY)
|
||||
|
||||
anchors.horizontalCenter: parent ? parent.horizontalCenter : undefined
|
||||
width: chat.delegateMaxWidth
|
||||
|
@ -410,8 +449,8 @@ Item {
|
|||
property int parentWidth: parent.width
|
||||
property string userId: wrapper.userId
|
||||
property string previousMessageUserId: wrapper.previousMessageUserId
|
||||
property string day: wrapper.day
|
||||
property string previousMessageDay: wrapper.previousMessageDay
|
||||
property var day: wrapper.day
|
||||
property var previousMessageDay: wrapper.previousMessageDay
|
||||
property bool previousMessageIsStateEvent: wrapper.previousMessageIsStateEvent
|
||||
property bool isStateEvent: wrapper.isStateEvent
|
||||
property bool isSender: wrapper.isSender
|
||||
|
@ -419,7 +458,7 @@ Item {
|
|||
property date timestamp: wrapper.timestamp
|
||||
|
||||
z: 4
|
||||
active: previousMessageUserId !== undefined && previousMessageUserId !== userId || previousMessageDay !== day || previousMessageIsStateEvent !== isStateEvent
|
||||
active: previousMessageUserId !== userId || previousMessageDay !== day || previousMessageIsStateEvent !== isStateEvent
|
||||
//asynchronous: true
|
||||
sourceComponent: sectionHeader
|
||||
visible: status == Loader.Ready
|
||||
|
@ -448,6 +487,7 @@ Item {
|
|||
isEdited: wrapper.isEdited
|
||||
isStateEvent: wrapper.isStateEvent
|
||||
replyTo: wrapper.replyTo
|
||||
threadId: wrapper.threadId
|
||||
userId: wrapper.userId
|
||||
userName: wrapper.userName
|
||||
roomTopic: wrapper.roomTopic
|
||||
|
@ -455,9 +495,11 @@ Item {
|
|||
callType: wrapper.callType
|
||||
reactions: wrapper.reactions
|
||||
trustlevel: wrapper.trustlevel
|
||||
notificationlevel: wrapper.notificationlevel
|
||||
encryptionError: wrapper.encryptionError
|
||||
timestamp: wrapper.timestamp
|
||||
status: wrapper.status
|
||||
index: wrapper.index
|
||||
relatedEventCacheBuster: wrapper.relatedEventCacheBuster
|
||||
y: section.visible && section.active ? section.y + section.height : 0
|
||||
|
||||
|
@ -507,7 +549,7 @@ Item {
|
|||
}
|
||||
|
||||
ScriptAction {
|
||||
script: chat.model.eventShown()
|
||||
script: room.eventShown()
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -532,7 +574,7 @@ Item {
|
|||
footer: Item {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.margins: Nheko.paddingLarge
|
||||
visible: chat.model && chat.model.paginationInProgress
|
||||
visible: (room && room.paginationInProgress) || chat.filteringInProgress
|
||||
// hacky, but works
|
||||
height: loadingSpinner.height + 2 * Nheko.paddingLarge
|
||||
|
||||
|
@ -541,7 +583,7 @@ Item {
|
|||
|
||||
anchors.centerIn: parent
|
||||
anchors.margins: Nheko.paddingLarge
|
||||
running: chat.model && chat.model.paginationInProgress
|
||||
running: (room && room.paginationInProgress) || chat.filteringInProgress
|
||||
foreground: Nheko.colors.mid
|
||||
z: 3
|
||||
}
|
||||
|
@ -553,6 +595,7 @@ Item {
|
|||
id: messageContextMenu
|
||||
|
||||
property string eventId
|
||||
property string threadId
|
||||
property string link
|
||||
property string text
|
||||
property int eventType
|
||||
|
@ -560,8 +603,9 @@ Item {
|
|||
property bool isEditable
|
||||
property bool isSender
|
||||
|
||||
function show(eventId_, eventType_, isSender_, isEncrypted_, isEditable_, link_, text_, showAt_) {
|
||||
function show(eventId_, threadId_, eventType_, isSender_, isEncrypted_, isEditable_, link_, text_, showAt_) {
|
||||
eventId = eventId_;
|
||||
threadId = threadId_;
|
||||
eventType = eventType_;
|
||||
isEncrypted = isEncrypted_;
|
||||
isEditable = isEditable_;
|
||||
|
@ -622,14 +666,21 @@ Item {
|
|||
Platform.MenuItem {
|
||||
visible: room ? room.permissions.canSend(MtxEvent.TextMessage) : false
|
||||
text: qsTr("Repl&y")
|
||||
onTriggered: room.replyAction(messageContextMenu.eventId)
|
||||
onTriggered: room.reply = (messageContextMenu.eventId)
|
||||
}
|
||||
|
||||
Platform.MenuItem {
|
||||
visible: messageContextMenu.isEditable && (room ? room.permissions.canSend(MtxEvent.TextMessage) : false)
|
||||
enabled: visible
|
||||
text: qsTr("&Edit")
|
||||
onTriggered: room.editAction(messageContextMenu.eventId)
|
||||
onTriggered: room.edit = (messageContextMenu.eventId)
|
||||
}
|
||||
|
||||
Platform.MenuItem {
|
||||
visible: (room ? room.permissions.canSend(MtxEvent.TextMessage) : false)
|
||||
enabled: visible
|
||||
text: qsTr("&Thread")
|
||||
onTriggered: room.thread = (messageContextMenu.threadId || messageContextMenu.eventId)
|
||||
}
|
||||
|
||||
Platform.MenuItem {
|
||||
|
@ -640,7 +691,7 @@ Item {
|
|||
}
|
||||
|
||||
Platform.MenuItem {
|
||||
text: qsTr("Read receip&ts")
|
||||
text: qsTr("&Read receipts")
|
||||
onTriggered: room.showReadReceipts(messageContextMenu.eventId)
|
||||
}
|
||||
|
||||
|
@ -747,7 +798,7 @@ Item {
|
|||
visible: true
|
||||
enabled: visible
|
||||
text: qsTr("&Go to quoted message")
|
||||
onTriggered: chat.model.showEvent(replyContextMenu.eventId)
|
||||
onTriggered: room.showEvent(replyContextMenu.eventId)
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -762,7 +813,7 @@ Item {
|
|||
property int fullWidth: 40
|
||||
width: 0
|
||||
height: width
|
||||
radius: width/2
|
||||
radius: 0
|
||||
onClicked: chat.positionViewAtBeginning();
|
||||
flat: true
|
||||
hoverEnabled: true
|
||||
|
@ -772,7 +823,7 @@ Item {
|
|||
opacity: enabled ? 1 : 0.3
|
||||
border.color: toEndButton.hovered ? Nheko.colors.highlight : Nheko.colors.buttonText
|
||||
border.width: 1
|
||||
radius: toEndButton.radius
|
||||
radius: 0
|
||||
}
|
||||
|
||||
states: [
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -39,12 +40,12 @@ BusyIndicator {
|
|||
Rectangle {
|
||||
implicitWidth: radius * 2
|
||||
implicitHeight: radius * 2
|
||||
radius: item.height / 6
|
||||
radius: 0
|
||||
color: Nheko.colors.text
|
||||
opacity: (index + 2) / (repeater.count + 2)
|
||||
transform: [
|
||||
Translate {
|
||||
y: -Math.min(item.width, item.height) * 0.5 + item.height / 6
|
||||
y: item.height / 2
|
||||
},
|
||||
Rotation {
|
||||
angle: index / repeater.count * 360
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -127,7 +128,7 @@ Item {
|
|||
|
||||
anchors.fill: parent
|
||||
source: timelineRoot
|
||||
radius: 50
|
||||
radius: 0
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -11,7 +12,7 @@ import im.nheko 1.0
|
|||
Popup {
|
||||
id: quickSwitcher
|
||||
|
||||
property int textHeight: Math.round(Qt.application.font.pixelSize * 2.4)
|
||||
property int textHeight: Math.round(Qt.application.font.pixelSize * 2)
|
||||
|
||||
background: null
|
||||
width: Math.min(Math.max(Math.round(parent.width / 2),450),parent.width) // limiting width to parent.width/2 can be a bit narrow
|
||||
|
@ -24,6 +25,7 @@ Popup {
|
|||
onOpened: {
|
||||
roomTextInput.forceActiveFocus();
|
||||
}
|
||||
onClosed: TimelineManager.focusMessageInput()
|
||||
property int textMargin: Nheko.paddingSmall
|
||||
|
||||
Column{
|
||||
|
@ -35,7 +37,7 @@ Popup {
|
|||
|
||||
width: parent.width
|
||||
font.pixelSize: Math.ceil(quickSwitcher.textHeight * 0.6)
|
||||
color: Nheko.colors.text
|
||||
color: Nheko.colors.brightText
|
||||
onTextEdited: {
|
||||
completerPopup.completer.searchString = text;
|
||||
}
|
||||
|
@ -67,7 +69,7 @@ Popup {
|
|||
avatarHeight: quickSwitcher.textHeight
|
||||
avatarWidth: quickSwitcher.textHeight
|
||||
centerRowContent: false
|
||||
rowMargin: Math.round(quickSwitcher.textMargin / 2)
|
||||
rowMargin: quickSwitcher.textMargin
|
||||
rowSpacing: quickSwitcher.textMargin
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -103,7 +104,7 @@ Flow {
|
|||
border.color: reaction.hovered ? Nheko.colors.text: gentleText
|
||||
color: reaction.hovered ? Nheko.colors.highlight : (modelData.selfReactedEvent !== '' ? gentleHighlight : Nheko.colors.window)
|
||||
border.width: 1
|
||||
radius: reaction.height / 2
|
||||
radius: 0
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -13,9 +14,9 @@ Rectangle {
|
|||
id: replyPopup
|
||||
|
||||
Layout.fillWidth: true
|
||||
visible: room && (room.reply || room.edit)
|
||||
visible: room && (room.reply || room.edit || room.thread)
|
||||
// Height of child, plus margins, plus border
|
||||
implicitHeight: (room && room.reply ? replyPreview.height : closeEditButton.height) + Nheko.paddingSmall
|
||||
implicitHeight: (room && room.reply ? replyPreview.height : Math.max(closeEditButton.height, closeThreadButton.height)) + Nheko.paddingSmall
|
||||
color: Nheko.colors.window
|
||||
z: 3
|
||||
|
||||
|
@ -71,7 +72,7 @@ Rectangle {
|
|||
id: closeEditButton
|
||||
|
||||
visible: room && room.edit
|
||||
anchors.right: parent.right
|
||||
anchors.right: closeThreadButton.left
|
||||
anchors.margins: 8
|
||||
anchors.top: parent.top
|
||||
hoverEnabled: true
|
||||
|
@ -83,4 +84,21 @@ Rectangle {
|
|||
onClicked: room.edit = undefined
|
||||
}
|
||||
|
||||
ImageButton {
|
||||
id: closeThreadButton
|
||||
|
||||
visible: room && room.thread
|
||||
anchors.right: parent.right
|
||||
anchors.margins: 8
|
||||
anchors.top: parent.top
|
||||
hoverEnabled: true
|
||||
buttonTextColor: room ? TimelineManager.userColor(room.thread, Nheko.colors.base) : Nheko.colors.buttonText
|
||||
image: ":/icons/icons/ui/dismiss_thread.svg"
|
||||
width: 22
|
||||
height: 22
|
||||
ToolTip.visible: closeThreadButton.hovered
|
||||
ToolTip.text: qsTr("Cancel Thread")
|
||||
onClicked: room.thread = undefined
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -19,6 +20,15 @@ Page {
|
|||
property int avatarSize: Math.ceil(fontMetrics.lineSpacing * 2.3)
|
||||
property bool collapsed: false
|
||||
|
||||
// HACK: https://bugreports.qt.io/browse/QTBUG-83972, qtwayland cannot auto hide menu
|
||||
Connections {
|
||||
function onHideMenu() {
|
||||
userInfoMenu.close()
|
||||
roomContextMenu.close()
|
||||
}
|
||||
target: MainWindow
|
||||
}
|
||||
|
||||
Component {
|
||||
id: roomDirectoryComponent
|
||||
|
||||
|
@ -48,7 +58,12 @@ Page {
|
|||
anchors.right: parent.right
|
||||
height: parent.height
|
||||
model: Rooms
|
||||
reuseItems: true
|
||||
//reuseItems: true
|
||||
|
||||
ScrollBar.vertical: ScrollBar {
|
||||
id: scrollbar
|
||||
parent: !collapsed && Settings.scrollbarsInRoomlist ? roomlist : null
|
||||
}
|
||||
|
||||
ScrollHelper {
|
||||
flickable: parent
|
||||
|
@ -108,6 +123,8 @@ Page {
|
|||
timelineRoot: timelineView
|
||||
windowTarget: roomWindowW
|
||||
}
|
||||
|
||||
onActiveChanged: { room.lastReadIdOnWindowFocus(); }
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -157,6 +174,11 @@ Page {
|
|||
}
|
||||
}
|
||||
|
||||
Platform.MenuItem {
|
||||
text: qsTr("Room settings")
|
||||
onTriggered: TimelineManager.openRoomSettings(roomContextMenu.roomid)
|
||||
}
|
||||
|
||||
Platform.MenuItem {
|
||||
text: qsTr("Leave room")
|
||||
onTriggered: TimelineManager.openLeaveRoomDialog(roomContextMenu.roomid)
|
||||
|
@ -209,7 +231,7 @@ Page {
|
|||
|
||||
roomid: roomContextMenu.roomid
|
||||
position: -1
|
||||
title: qsTr("Add or remove from space")
|
||||
title: qsTr("Add or remove from community...")
|
||||
childMenu: nestedSpaceMenuLevel
|
||||
}
|
||||
}
|
||||
|
@ -218,8 +240,8 @@ Page {
|
|||
id: roomItem
|
||||
|
||||
property color backgroundColor: Nheko.colors.window
|
||||
property color importantText: Nheko.colors.text
|
||||
property color unimportantText: Nheko.colors.buttonText
|
||||
property color importantText: Nheko.colors.brightText
|
||||
property color unimportantText: Nheko.colors.text
|
||||
property color bubbleBackground: Nheko.colors.highlight
|
||||
property color bubbleText: Nheko.colors.highlightedText
|
||||
required property string roomName
|
||||
|
@ -241,7 +263,7 @@ Page {
|
|||
}
|
||||
|
||||
height: avatarSize + 2 * Nheko.paddingMedium
|
||||
width: ListView.view.width
|
||||
width: ListView.view.width - ((scrollbar.interactive && scrollbar.visible && scrollbar.parent) ? scrollbar.width : 0)
|
||||
state: "normal"
|
||||
ToolTip.visible: hovered && collapsed
|
||||
ToolTip.delay: Nheko.tooltipDelay
|
||||
|
@ -249,9 +271,6 @@ Page {
|
|||
onClicked: {
|
||||
console.log("tapped " + roomId);
|
||||
|
||||
if (isSpace && Communities.currentTagId != "space:"+roomId)
|
||||
Communities.currentTagId = "space:"+roomId;
|
||||
|
||||
if (!Rooms.currentRoom || Rooms.currentRoom.roomId !== roomId)
|
||||
Rooms.setCurrentRoom(roomId);
|
||||
else
|
||||
|
@ -382,7 +401,7 @@ Page {
|
|||
Layout.alignment: Qt.AlignBaseline
|
||||
color: roomItem.importantText
|
||||
elideWidth: width
|
||||
fullText: roomName
|
||||
fullText: TimelineManager.htmlEscape(roomName)
|
||||
textFormat: Text.RichText
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
@ -413,7 +432,7 @@ Page {
|
|||
color: roomItem.unimportantText
|
||||
font.pixelSize: fontMetrics.font.pixelSize * 0.9
|
||||
elideWidth: width
|
||||
fullText: lastMessage
|
||||
fullText: TimelineManager.htmlEscape(lastMessage)
|
||||
textFormat: Text.RichText
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
@ -453,7 +472,7 @@ Page {
|
|||
|
||||
function openUserProfile() {
|
||||
Nheko.updateUserProfile();
|
||||
var userProfile = userProfileComponent.createObject(timelineRoot, {
|
||||
var userProfile = Qt.createComponent("qrc:/qml/dialogs/UserProfile.qml").createObject(timelineRoot, {
|
||||
"profile": Nheko.currentUser
|
||||
});
|
||||
userProfile.show();
|
||||
|
@ -562,7 +581,7 @@ Page {
|
|||
ImageButton {
|
||||
id: logoutButton
|
||||
|
||||
visible: !collapsed
|
||||
visible: false
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
Layout.preferredWidth: fontMetrics.lineSpacing * 2
|
||||
Layout.preferredHeight: fontMetrics.lineSpacing * 2
|
||||
|
@ -687,7 +706,7 @@ Page {
|
|||
horizontalPadding: Nheko.paddingMedium
|
||||
verticalPadding: 0
|
||||
|
||||
background: Rectangle {color: Nheko.colors.window}
|
||||
background: Rectangle {color: Nheko.colors.base}
|
||||
contentItem: RowLayout {
|
||||
id: buttonRow
|
||||
|
||||
|
@ -761,7 +780,7 @@ Page {
|
|||
}
|
||||
|
||||
ImageButton {
|
||||
visible: !collapsed
|
||||
visible: false
|
||||
Layout.fillWidth: true
|
||||
hoverEnabled: true
|
||||
ripple: false
|
||||
|
@ -773,9 +792,9 @@ Page {
|
|||
ToolTip.text: qsTr("Search rooms (Ctrl+K)")
|
||||
Layout.margins: Nheko.paddingMedium
|
||||
onClicked: {
|
||||
var quickSwitch = quickSwitcherComponent.createObject(timelineRoot);
|
||||
var quickSwitch = Qt.createComponent("qrc:/qml/QuickSwitcher.qml").createObject(timelineRoot);
|
||||
quickSwitch.open();
|
||||
timelineRoot.destroyOnClose(quickSwitch);
|
||||
destroyOnClosed(quickSwitch);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -33,6 +34,10 @@ Pane {
|
|||
id: publicRooms
|
||||
}
|
||||
|
||||
UserDirectoryModel {
|
||||
id: userDirectory
|
||||
}
|
||||
|
||||
//Timer {
|
||||
// onTriggered: gc()
|
||||
// interval: 1000
|
||||
|
@ -47,99 +52,37 @@ Pane {
|
|||
model: TimelineManager.completerFor("allemoji", "")
|
||||
}
|
||||
|
||||
Component {
|
||||
id: userProfileComponent
|
||||
|
||||
UserProfile {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function showAliasEditor(settings) {
|
||||
var dialog = aliasEditor.createObject(timelineRoot, {
|
||||
var dialog = Qt.createComponent("qrc:/qml/dialogs/AliasEditor.qml").createObject(timelineRoot, {
|
||||
"roomSettings": settings
|
||||
});
|
||||
dialog.show();
|
||||
destroyOnClose(dialog);
|
||||
}
|
||||
|
||||
Component {
|
||||
id: aliasEditor
|
||||
|
||||
AliasEditor {
|
||||
}
|
||||
}
|
||||
|
||||
function showPLEditor(settings) {
|
||||
var dialog = plEditor.createObject(timelineRoot, {
|
||||
var dialog = Qt.createComponent("qrc:/qml/dialogs/PowerLevelEditor.qml").createObject(timelineRoot, {
|
||||
"roomSettings": settings
|
||||
});
|
||||
dialog.show();
|
||||
destroyOnClose(dialog);
|
||||
}
|
||||
|
||||
Component {
|
||||
id: plEditor
|
||||
|
||||
PowerLevelEditor {
|
||||
}
|
||||
function showSpacePLApplyPrompt(settings, editingModel) {
|
||||
var dialog = Qt.createComponent("qrc:/qml/dialogs/PowerLevelSpacesApplyDialog.qml").createObject(timelineRoot, {
|
||||
"roomSettings": settings,
|
||||
"editingModel": editingModel
|
||||
});
|
||||
dialog.show();
|
||||
destroyOnClose(dialog);
|
||||
}
|
||||
|
||||
|
||||
Component {
|
||||
id: roomSettingsComponent
|
||||
|
||||
RoomSettings {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Component {
|
||||
id: roomMembersComponent
|
||||
|
||||
RoomMembers {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Component {
|
||||
id: mobileCallInviteDialog
|
||||
|
||||
CallInvite {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Component {
|
||||
id: quickSwitcherComponent
|
||||
|
||||
QuickSwitcher {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Component {
|
||||
id: deviceVerificationDialog
|
||||
|
||||
DeviceVerification {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Component {
|
||||
id: inviteDialog
|
||||
|
||||
InviteDialog {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Component {
|
||||
id: packSettingsComponent
|
||||
|
||||
ImagePackSettingsDialog {
|
||||
}
|
||||
|
||||
function showAllowedRoomsEditor(settings) {
|
||||
var dialog = Qt.createComponent("qrc:/qml/dialogs/AllowedRoomsSettingsDialog.qml").createObject(timelineRoot, {
|
||||
"roomSettings": settings
|
||||
});
|
||||
dialog.show();
|
||||
destroyOnClose(dialog);
|
||||
}
|
||||
|
||||
Component {
|
||||
|
@ -150,62 +93,6 @@ Pane {
|
|||
|
||||
}
|
||||
|
||||
Component {
|
||||
id: rawMessageDialog
|
||||
|
||||
RawMessageDialog {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Component {
|
||||
id: logoutDialog
|
||||
|
||||
LogoutDialog {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Component {
|
||||
id: joinRoomDialog
|
||||
|
||||
JoinRoomDialog {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Component {
|
||||
id: confirmJoinRoomDialog
|
||||
|
||||
ConfirmJoinRoomDialog {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Component {
|
||||
id: leaveRoomComponent
|
||||
|
||||
LeaveRoomDialog {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Component {
|
||||
id: imageOverlay
|
||||
|
||||
ImageOverlay {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Component {
|
||||
id: userSettingsPage
|
||||
|
||||
UserSettingsPage {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Shortcut {
|
||||
sequence: StandardKey.Quit
|
||||
onActivated: Qt.quit()
|
||||
|
@ -214,7 +101,7 @@ Pane {
|
|||
Shortcut {
|
||||
sequence: "Ctrl+K"
|
||||
onActivated: {
|
||||
var quickSwitch = quickSwitcherComponent.createObject(timelineRoot);
|
||||
var quickSwitch = Qt.createComponent("qrc:/qml/QuickSwitcher.qml").createObject(timelineRoot);
|
||||
quickSwitch.open();
|
||||
destroyOnClosed(quickSwitch);
|
||||
}
|
||||
|
@ -238,19 +125,19 @@ Pane {
|
|||
|
||||
Connections {
|
||||
function onOpenLogoutDialog() {
|
||||
var dialog = logoutDialog.createObject(timelineRoot);
|
||||
var dialog = Qt.createComponent("qrc:/qml/dialogs/LogoutDialog.qml").createObject(timelineRoot);
|
||||
dialog.open();
|
||||
destroyOnClose(dialog);
|
||||
}
|
||||
|
||||
function onOpenJoinRoomDialog() {
|
||||
var dialog = joinRoomDialog.createObject(timelineRoot);
|
||||
var dialog = Qt.createComponent("qrc:/qml/dialogs/JoinRoomDialog.qml").createObject(timelineRoot);
|
||||
dialog.show();
|
||||
destroyOnClose(dialog);
|
||||
}
|
||||
|
||||
function onShowRoomJoinPrompt(summary) {
|
||||
var dialog = confirmJoinRoomDialog.createObject(timelineRoot, {"summary": summary});
|
||||
var dialog = Qt.createComponent("qrc:/qml/dialogs/ConfirmJoinRoomDialog.qml").createObject(timelineRoot, {"summary": summary});
|
||||
dialog.show();
|
||||
destroyOnClose(dialog);
|
||||
}
|
||||
|
@ -260,7 +147,7 @@ Pane {
|
|||
|
||||
Connections {
|
||||
function onNewDeviceVerificationRequest(flow) {
|
||||
var dialog = deviceVerificationDialog.createObject(timelineRoot, {
|
||||
var dialog = Qt.createComponent("qrc:/qml/device-verification/DeviceVerification.qml").createObject(timelineRoot, {
|
||||
"flow": flow
|
||||
});
|
||||
dialog.show();
|
||||
|
@ -281,7 +168,7 @@ Pane {
|
|||
|
||||
Connections {
|
||||
function onOpenProfile(profile) {
|
||||
var userProfile = userProfileComponent.createObject(timelineRoot, {
|
||||
var userProfile = Qt.createComponent("qrc:/qml/dialogs/UserProfile.qml").createObject(timelineRoot, {
|
||||
"profile": profile
|
||||
});
|
||||
userProfile.show();
|
||||
|
@ -289,7 +176,7 @@ Pane {
|
|||
}
|
||||
|
||||
function onShowImagePackSettings(room, packlist) {
|
||||
var packSet = packSettingsComponent.createObject(timelineRoot, {
|
||||
var packSet = Qt.createComponent("qrc:/qml/dialogs/ImagePackSettingsDialog.qml").createObject(timelineRoot, {
|
||||
"room": room,
|
||||
"packlist": packlist
|
||||
});
|
||||
|
@ -298,7 +185,7 @@ Pane {
|
|||
}
|
||||
|
||||
function onOpenRoomMembersDialog(members, room) {
|
||||
var membersDialog = roomMembersComponent.createObject(timelineRoot, {
|
||||
var membersDialog = Qt.createComponent("qrc:/qml/dialogs/RoomMembers.qml").createObject(timelineRoot, {
|
||||
"members": members,
|
||||
"room": room
|
||||
});
|
||||
|
@ -307,7 +194,7 @@ Pane {
|
|||
}
|
||||
|
||||
function onOpenRoomSettingsDialog(settings) {
|
||||
var roomSettings = roomSettingsComponent.createObject(timelineRoot, {
|
||||
var roomSettings = Qt.createComponent("qrc:/qml/dialogs/RoomSettings.qml").createObject(timelineRoot, {
|
||||
"roomSettings": settings
|
||||
});
|
||||
roomSettings.show();
|
||||
|
@ -315,17 +202,21 @@ Pane {
|
|||
}
|
||||
|
||||
function onOpenInviteUsersDialog(invitees) {
|
||||
var dialog = inviteDialog.createObject(timelineRoot, {
|
||||
var component = Qt.createComponent("qrc:/qml/dialogs/InviteDialog.qml")
|
||||
var dialog = component.createObject(timelineRoot, {
|
||||
"roomId": Rooms.currentRoom.roomId,
|
||||
"plainRoomName": Rooms.currentRoom.plainRoomName,
|
||||
"invitees": invitees
|
||||
});
|
||||
if (component.status != Component.Ready) {
|
||||
console.log("Failed to create component: " + component.errorString());
|
||||
}
|
||||
dialog.show();
|
||||
destroyOnClose(dialog);
|
||||
}
|
||||
|
||||
function onOpenLeaveRoomDialog(roomid, reason) {
|
||||
var dialog = leaveRoomComponent.createObject(timelineRoot, {
|
||||
var dialog = Qt.createComponent("qrc:/qml/dialogs/LeaveRoomDialog.qml").createObject(timelineRoot, {
|
||||
"roomId": roomid,
|
||||
"reason": reason
|
||||
});
|
||||
|
@ -334,7 +225,7 @@ Pane {
|
|||
}
|
||||
|
||||
function onShowImageOverlay(room, eventId, url, originalWidth, proportionalHeight) {
|
||||
var dialog = imageOverlay.createObject(timelineRoot, {
|
||||
var dialog = Qt.createComponent("qrc:/qml/dialogs/ImageOverlay.qml").createObject(timelineRoot, {
|
||||
"room": room,
|
||||
"eventId": eventId,
|
||||
"url": url,
|
||||
|
@ -352,7 +243,7 @@ Pane {
|
|||
Connections {
|
||||
function onNewInviteState() {
|
||||
if (CallManager.haveCallInvite && Settings.mobileMode) {
|
||||
var dialog = mobileCallInviteDialog.createObject(timelineRoot);
|
||||
var dialog = Qt.createComponent("qrc:/qml/voip/CallInvite.qml").createObject(timelineRoot);
|
||||
dialog.open();
|
||||
destroyOnClose(dialog);
|
||||
}
|
||||
|
@ -399,7 +290,7 @@ Pane {
|
|||
id: uiaTokenPrompt
|
||||
|
||||
title: UIA.title
|
||||
prompt: qsTr("Please enter the token, which has been sent to you:")
|
||||
prompt: qsTr("Please enter the token which has been sent to you:")
|
||||
onAccepted: (t) => {
|
||||
return UIA.submit3pidToken(t);
|
||||
}
|
||||
|
@ -454,6 +345,63 @@ Pane {
|
|||
|
||||
anchors.fill: parent
|
||||
initialItem: welcomePage
|
||||
|
||||
Transition {
|
||||
id: reducedMotionTransitionExit
|
||||
PropertyAnimation {
|
||||
property: "opacity"
|
||||
from: 1
|
||||
to:0
|
||||
duration: 200
|
||||
}
|
||||
}
|
||||
Transition {
|
||||
id: reducedMotionTransitionEnter
|
||||
SequentialAnimation {
|
||||
PropertyAction { property: "opacity"; value: 0 }
|
||||
PauseAnimation { duration: 200 }
|
||||
PropertyAnimation {
|
||||
property: "opacity"
|
||||
from: 0
|
||||
to:1
|
||||
duration: 200
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// for some reason direct bindings to a hidden StackView don't work, so manually store and restore here.
|
||||
property Transition pushEnterOrg
|
||||
property Transition pushExitOrg
|
||||
property Transition popEnterOrg
|
||||
property Transition popExitOrg
|
||||
property Transition replaceEnterOrg
|
||||
property Transition replaceExitOrg
|
||||
Component.onCompleted: {
|
||||
pushEnterOrg = pushEnter;
|
||||
popEnterOrg = popEnter;
|
||||
replaceEnterOrg = replaceEnter;
|
||||
pushExitOrg = pushExit;
|
||||
popExitOrg = popExit;
|
||||
replaceExitOrg = replaceExit;
|
||||
|
||||
updateTrans()
|
||||
}
|
||||
|
||||
function updateTrans() {
|
||||
pushEnter = Settings.reducedMotion ? reducedMotionTransitionEnter : pushEnterOrg;
|
||||
pushExit = Settings.reducedMotion ? reducedMotionTransitionExit : pushExitOrg;
|
||||
popEnter = Settings.reducedMotion ? reducedMotionTransitionEnter : popEnterOrg;
|
||||
popExit = Settings.reducedMotion ? reducedMotionTransitionExit : popExitOrg;
|
||||
replaceEnter = Settings.reducedMotion ? reducedMotionTransitionEnter : replaceEnterOrg;
|
||||
replaceExit = Settings.reducedMotion ? reducedMotionTransitionExit : replaceExitOrg;
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: Settings
|
||||
function onReducedMotionChanged() {
|
||||
mainWindow.updateTrans();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
|
@ -484,6 +432,15 @@ Pane {
|
|||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: userSettingsPage
|
||||
|
||||
UserSettingsPage {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
Snackbar { id: snackbar }
|
||||
|
||||
Connections {
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
// Copyright (C) 2017 Christian Mollekopf, <mollekopf@kolabsystems.com>
|
||||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -61,7 +62,7 @@ Item {
|
|||
color: Nheko.colors.window
|
||||
border.color: Nheko.theme.separator
|
||||
border.width: 1
|
||||
radius: Nheko.paddingSmall
|
||||
radius: 0
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -213,7 +214,7 @@ Item {
|
|||
color: Nheko.colors.window
|
||||
border.color: Nheko.theme.separator
|
||||
border.width: 1
|
||||
radius: Nheko.paddingSmall
|
||||
radius: 0
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -33,6 +34,7 @@ AbstractButton {
|
|||
required property bool isEdited
|
||||
required property bool isStateEvent
|
||||
required property string replyTo
|
||||
required property string threadId
|
||||
required property string userId
|
||||
required property string userName
|
||||
required property string roomTopic
|
||||
|
@ -40,16 +42,18 @@ AbstractButton {
|
|||
required property string callType
|
||||
required property var reactions
|
||||
required property int trustlevel
|
||||
required property int notificationlevel
|
||||
required property int encryptionError
|
||||
required property int duration
|
||||
required property var timestamp
|
||||
required property int status
|
||||
required property int index
|
||||
required property int relatedEventCacheBuster
|
||||
|
||||
hoverEnabled: true
|
||||
|
||||
width: parent.width
|
||||
height: row.height+(reactionRow.height > 0 ? reactionRow.height-2 : 0 )
|
||||
height: row.height+(reactionRow.height > 0 ? reactionRow.height-2 : 0 )+unreadRow.height
|
||||
|
||||
Rectangle {
|
||||
color: (Settings.messageHoverHighlight && hovered) ? Nheko.colors.alternateBase : "transparent"
|
||||
|
@ -57,15 +61,15 @@ AbstractButton {
|
|||
// this looks better without margins
|
||||
TapHandler {
|
||||
acceptedButtons: Qt.RightButton
|
||||
onSingleTapped: messageContextMenu.show(eventId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText)
|
||||
onSingleTapped: messageContextMenu.show(eventId, threadId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText)
|
||||
gesturePolicy: TapHandler.ReleaseWithinBounds
|
||||
acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus | PointerDevice.TouchPad
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
onPressAndHold: messageContextMenu.show(eventId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText)
|
||||
onDoubleClicked: chat.model.reply = eventId
|
||||
onPressAndHold: messageContextMenu.show(eventId, threadId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText)
|
||||
onDoubleClicked: room.reply = eventId
|
||||
|
||||
DragHandler {
|
||||
id: draghandler
|
||||
|
@ -74,7 +78,7 @@ AbstractButton {
|
|||
xAxis.minimum: -100
|
||||
onActiveChanged: {
|
||||
if(!active && (x < -70 || x > 70))
|
||||
chat.model.reply = eventId
|
||||
room.reply = eventId
|
||||
}
|
||||
}
|
||||
states: State {
|
||||
|
@ -114,7 +118,9 @@ AbstractButton {
|
|||
property color userColor: TimelineManager.userColor(userId, Nheko.colors.base)
|
||||
property color bgColor: Nheko.colors.base
|
||||
color: (Settings.bubbles && !isStateEvent) ? Qt.tint(bgColor, Qt.hsla(userColor.hslHue, 0.5, userColor.hslLightness, 0.2)) : "#00000000"
|
||||
radius: 4
|
||||
radius: 0
|
||||
border.width: r.notificationlevel == MtxEvent.Highlight ? 1 : 0
|
||||
border.color: Nheko.theme.red
|
||||
|
||||
GridLayout {
|
||||
anchors {
|
||||
|
@ -123,6 +129,7 @@ AbstractButton {
|
|||
right: parent.right
|
||||
margins: (Settings.bubbles && ! isStateEvent)? 4 : 2
|
||||
leftMargin: 4
|
||||
rightMargin: 4
|
||||
}
|
||||
id: msg
|
||||
rowSpacing: 0
|
||||
|
@ -229,13 +236,13 @@ AbstractButton {
|
|||
}
|
||||
|
||||
Image {
|
||||
visible: isEdited || eventId == chat.model.edit
|
||||
visible: isEdited || eventId == room.edit
|
||||
Layout.alignment: Qt.AlignRight | Qt.AlignTop
|
||||
height: parent.iconSize
|
||||
width: parent.iconSize
|
||||
sourceSize.width: parent.iconSize * Screen.devicePixelRatio
|
||||
sourceSize.height: parent.iconSize * Screen.devicePixelRatio
|
||||
source: "image://colorimage/:/icons/icons/ui/edit.svg?" + ((eventId == chat.model.edit) ? Nheko.colors.highlight : Nheko.colors.buttonText)
|
||||
source: "image://colorimage/:/icons/icons/ui/edit.svg?" + ((eventId == room.edit) ? Nheko.colors.highlight : Nheko.colors.buttonText)
|
||||
ToolTip.visible: editHovered.hovered
|
||||
ToolTip.delay: Nheko.tooltipDelay
|
||||
ToolTip.text: qsTr("Edited")
|
||||
|
@ -247,6 +254,20 @@ AbstractButton {
|
|||
|
||||
}
|
||||
|
||||
ImageButton {
|
||||
visible: threadId
|
||||
Layout.alignment: Qt.AlignRight | Qt.AlignTop
|
||||
height: parent.iconSize
|
||||
width: parent.iconSize
|
||||
image: ":/icons/icons/ui/thread.svg"
|
||||
buttonTextColor: TimelineManager.userColor(threadId, Nheko.colors.base)
|
||||
ToolTip.visible: hovered
|
||||
ToolTip.delay: Nheko.tooltipDelay
|
||||
ToolTip.text: qsTr("Part of a thread")
|
||||
anchors.verticalCenter: ts.verticalCenter
|
||||
onClicked: room.thread = threadId
|
||||
}
|
||||
|
||||
EncryptionIndicator {
|
||||
visible: room.isEncrypted
|
||||
encrypted: isEncrypted
|
||||
|
@ -277,10 +298,11 @@ AbstractButton {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reactions {
|
||||
anchors {
|
||||
top: row.bottom
|
||||
topMargin: -2
|
||||
topMargin: -4
|
||||
left: row.bubbleOnRight? undefined : row.left
|
||||
right: row.bubbleOnRight? row.right : undefined
|
||||
}
|
||||
|
@ -292,4 +314,19 @@ AbstractButton {
|
|||
reactions: r.reactions
|
||||
eventId: r.eventId
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: unreadRow
|
||||
anchors {
|
||||
top: reactionRow.bottom
|
||||
topMargin: 5
|
||||
left: parent.left
|
||||
right: parent.right
|
||||
}
|
||||
color: Nheko.colors.highlight
|
||||
|
||||
visible: (r.index > 0 && (room.fullyReadEventId == r.eventId))
|
||||
height: visible ? 3 : 0
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -13,6 +14,7 @@ import Qt.labs.platform 1.1 as Platform
|
|||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.5
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtQuick.Particles 2.15
|
||||
import QtQuick.Window 2.13
|
||||
import im.nheko 1.0
|
||||
import im.nheko.EmojiModel 1.0
|
||||
|
@ -23,8 +25,14 @@ Item {
|
|||
property var room: null
|
||||
property var roomPreview: null
|
||||
property bool showBackButton: false
|
||||
property bool shouldEffectsRun: false
|
||||
clip: true
|
||||
|
||||
onRoomChanged: if (room != null) room.triggerSpecialEffects()
|
||||
|
||||
// focus message input on key press, but not on Ctrl-C and such.
|
||||
Keys.onPressed: if (event.text && !topBar.searchHasFocus) TimelineManager.focusMessageInput();
|
||||
|
||||
Shortcut {
|
||||
sequence: StandardKey.Close
|
||||
onActivated: Rooms.resetCurrentRoom()
|
||||
|
@ -66,6 +74,8 @@ Item {
|
|||
spacing: 0
|
||||
|
||||
TopBar {
|
||||
id: topBar
|
||||
|
||||
showBackButton: timelineView.showBackButton
|
||||
}
|
||||
|
||||
|
@ -81,7 +91,7 @@ Item {
|
|||
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
color: Nheko.colors.base
|
||||
color: Nheko.colors.window
|
||||
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
|
@ -102,6 +112,7 @@ Item {
|
|||
|
||||
MessageView {
|
||||
implicitHeight: msgView.height - typingIndicator.height
|
||||
searchString: topBar.searchString
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
|
@ -161,6 +172,7 @@ Item {
|
|||
property string roomName: room ? room.roomName : (roomPreview ? roomPreview.roomName : "")
|
||||
property string roomTopic: room ? room.roomTopic : (roomPreview ? roomPreview.roomTopic : "")
|
||||
property string avatarUrl: room ? room.roomAvatarUrl : (roomPreview ? roomPreview.roomAvatarUrl : "")
|
||||
property string reason: roomPreview ? roomPreview.reason : ""
|
||||
|
||||
visible: room != null && room.isSpace || roomPreview != null
|
||||
enabled: visible
|
||||
|
@ -268,6 +280,44 @@ Item {
|
|||
onClicked: Rooms.declineInvite(roomPreview.roomid)
|
||||
}
|
||||
|
||||
ScrollView {
|
||||
id: reasonField
|
||||
property bool showReason: false
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.fillWidth: true
|
||||
Layout.leftMargin: Nheko.paddingLarge
|
||||
Layout.rightMargin: Nheko.paddingLarge
|
||||
visible: preview.reason !== "" && showReason
|
||||
|
||||
TextArea {
|
||||
text: TimelineManager.escapeEmoji(preview.reason)
|
||||
wrapMode: TextEdit.WordWrap
|
||||
textFormat: TextEdit.RichText
|
||||
readOnly: true
|
||||
background: null
|
||||
selectByMouse: true
|
||||
color: Nheko.colors.text
|
||||
horizontalAlignment: TextEdit.AlignHCenter
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Button {
|
||||
id: showReasonButton
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
//Layout.fillWidth: true
|
||||
Layout.leftMargin: Nheko.paddingLarge
|
||||
Layout.rightMargin: Nheko.paddingLarge
|
||||
|
||||
visible: preview.reason !== ""
|
||||
text: reasonField.showReason ? qsTr("Hide invite reason") : qsTr("Show invite reason")
|
||||
onClicked: {
|
||||
reasonField.showReason = !reasonField.showReason;
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
visible: room != null
|
||||
Layout.preferredHeight: Math.ceil(fontMetrics.lineSpacing * 2)
|
||||
|
@ -295,11 +345,75 @@ Item {
|
|||
onClicked: Rooms.resetCurrentRoom()
|
||||
}
|
||||
|
||||
ParticleSystem { id: confettiParticleSystem
|
||||
Component.onCompleted: pause();
|
||||
paused: !shouldEffectsRun
|
||||
}
|
||||
|
||||
Emitter {
|
||||
id: confettiEmitter
|
||||
|
||||
width: parent.width * 3/4
|
||||
enabled: false
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
y: parent.height
|
||||
emitRate: Math.min(400 * Math.sqrt(parent.width * parent.height) / 870, 1000)
|
||||
lifeSpan: 15000
|
||||
system: confettiParticleSystem
|
||||
maximumEmitted: 500
|
||||
velocityFromMovement: 8
|
||||
size: 16
|
||||
sizeVariation: 4
|
||||
velocity: PointDirection {
|
||||
x: 0
|
||||
y: -Math.min(450 * parent.height / 700, 1000)
|
||||
xVariation: Math.min(4 * parent.width / 7, 450)
|
||||
yVariation: 250
|
||||
}
|
||||
}
|
||||
|
||||
ImageParticle {
|
||||
system: confettiParticleSystem
|
||||
source: "qrc:/confettiparticle.svg"
|
||||
rotationVelocity: 0
|
||||
rotationVelocityVariation: 360
|
||||
colorVariation: 1
|
||||
color: "white"
|
||||
entryEffect: ImageParticle.None
|
||||
xVector: PointDirection {
|
||||
x: 1
|
||||
y: 0
|
||||
xVariation: 0.2
|
||||
yVariation: 0.2
|
||||
}
|
||||
yVector: PointDirection {
|
||||
x: 0
|
||||
y: 0.5
|
||||
xVariation: 0.2
|
||||
yVariation: 0.2
|
||||
}
|
||||
}
|
||||
|
||||
Gravity {
|
||||
system: confettiParticleSystem
|
||||
anchors.fill: parent
|
||||
magnitude: 350
|
||||
angle: 90
|
||||
}
|
||||
|
||||
NhekoDropArea {
|
||||
anchors.fill: parent
|
||||
roomid: room ? room.roomId : ""
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: effectsTimer
|
||||
onTriggered: shouldEffectsRun = false;
|
||||
interval: confettiEmitter.lifeSpan
|
||||
repeat: false
|
||||
running: false
|
||||
}
|
||||
|
||||
Connections {
|
||||
function onOpenReadReceiptsDialog(rr) {
|
||||
var dialog = readReceiptsDialog.createObject(timelineRoot, {
|
||||
|
@ -311,13 +425,31 @@ Item {
|
|||
}
|
||||
|
||||
function onShowRawMessageDialog(rawMessage) {
|
||||
var dialog = rawMessageDialog.createObject(timelineRoot, {
|
||||
var dialog = Qt.createComponent("qrc:/qml/dialogs/RawMessageDialog.qml").createObject(timelineRoot, {
|
||||
"rawMessage": rawMessage
|
||||
});
|
||||
dialog.show();
|
||||
timelineRoot.destroyOnClose(dialog);
|
||||
}
|
||||
|
||||
function onConfetti()
|
||||
{
|
||||
if (!Settings.fancyEffects)
|
||||
return
|
||||
|
||||
shouldEffectsRun = true;
|
||||
confettiEmitter.pulse(parent.height * 2)
|
||||
room.markSpecialEffectsDone()
|
||||
}
|
||||
|
||||
function onConfettiDone()
|
||||
{
|
||||
if (!Settings.fancyEffects)
|
||||
return
|
||||
|
||||
effectsTimer.start();
|
||||
}
|
||||
|
||||
target: room
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -22,7 +23,7 @@ Switch {
|
|||
|
||||
Rectangle {
|
||||
height: 3 * parent.height / 4
|
||||
radius: height / 2
|
||||
radius: 0
|
||||
width: parent.width - height
|
||||
x: radius
|
||||
y: parent.height / 2 - height / 2
|
||||
|
@ -35,7 +36,7 @@ Switch {
|
|||
y: parent.height / 2 - height / 2
|
||||
width: parent.height
|
||||
height: width
|
||||
radius: width / 2
|
||||
radius: 0
|
||||
color: toggleButton.enabled ? "whitesmoke" : "#cccccc"
|
||||
border.color: "#ebebeb"
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -25,13 +26,36 @@ Pane {
|
|||
property bool isDirect: room ? room.isDirect : false
|
||||
property string directChatOtherUserId: room ? room.directChatOtherUserId : ""
|
||||
|
||||
property bool searchHasFocus: searchField.focus && searchField.enabled
|
||||
|
||||
property string searchString: ""
|
||||
|
||||
// HACK: https://bugreports.qt.io/browse/QTBUG-83972, qtwayland cannot auto hide menu
|
||||
Connections {
|
||||
function onHideMenu() {
|
||||
roomOptionsMenu.close()
|
||||
}
|
||||
target: MainWindow
|
||||
}
|
||||
|
||||
onRoomIdChanged: {
|
||||
searchString = "";
|
||||
searchButton.searchActive = false;
|
||||
searchField.text = ""
|
||||
}
|
||||
|
||||
Shortcut {
|
||||
sequence: StandardKey.Find
|
||||
onActivated: searchButton.searchActive = !searchButton.searchActive
|
||||
}
|
||||
|
||||
Layout.fillWidth: true
|
||||
implicitHeight: topLayout.height + Nheko.paddingMedium * 2
|
||||
z: 3
|
||||
|
||||
padding: 0
|
||||
background: Rectangle {
|
||||
color: Nheko.colors.window
|
||||
color: Nheko.colors.base
|
||||
}
|
||||
|
||||
TapHandler {
|
||||
|
@ -49,6 +73,13 @@ Pane {
|
|||
return;
|
||||
}
|
||||
|
||||
if (communityLabel.visible && eventPoint.position.y < communityAvatar.height + Nheko.paddingMedium + Nheko.paddingSmall/2) {
|
||||
if (!Communities.trySwitchToSpace(room.parentSpace.roomid))
|
||||
room.parentSpace.promptJoin();
|
||||
eventPoint.accepted = true
|
||||
return;
|
||||
}
|
||||
|
||||
if (room) {
|
||||
let p = topBar.mapToItem(roomTopicC, eventPoint.position.x, eventPoint.position.y);
|
||||
let link = roomTopicC.linkAt(p.x, p.y);
|
||||
|
@ -80,17 +111,52 @@ Pane {
|
|||
columnSpacing: Nheko.paddingSmall
|
||||
rowSpacing: Nheko.paddingSmall
|
||||
|
||||
|
||||
Avatar {
|
||||
id: communityAvatar
|
||||
|
||||
visible: roomid && room.parentSpace.isLoaded && ("space:"+room.parentSpace.roomid != Communities.currentTagId)
|
||||
|
||||
property string avatarUrl: (Settings.groupView && room && room.parentSpace && room.parentSpace.roomAvatarUrl) || ""
|
||||
property string communityId: (Settings.groupView && room && room.parentSpace && room.parentSpace.roomid) || ""
|
||||
property string communityName: (Settings.groupView && room && room.parentSpace && room.parentSpace.roomName) || ""
|
||||
|
||||
Layout.column: 1
|
||||
Layout.row: 0
|
||||
Layout.alignment: Qt.AlignRight
|
||||
width: fontMetrics.lineSpacing
|
||||
height: fontMetrics.lineSpacing
|
||||
url: avatarUrl.replace("mxc://", "image://MxcImage/")
|
||||
roomid: communityId
|
||||
displayName: communityName
|
||||
enabled: false
|
||||
}
|
||||
|
||||
Label {
|
||||
id: communityLabel
|
||||
visible: communityAvatar.visible
|
||||
|
||||
Layout.column: 2
|
||||
Layout.row: 0
|
||||
Layout.fillWidth: true
|
||||
color: Nheko.colors.text
|
||||
text: qsTr("In %1").arg(communityAvatar.displayName)
|
||||
maximumLineCount: 1
|
||||
elide: Text.ElideRight
|
||||
textFormat: Text.RichText
|
||||
}
|
||||
|
||||
ImageButton {
|
||||
id: backToRoomsButton
|
||||
|
||||
Layout.column: 0
|
||||
Layout.row: 0
|
||||
Layout.row: 1
|
||||
Layout.rowSpan: 2
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
Layout.preferredHeight: Nheko.avatarSize - Nheko.paddingMedium
|
||||
Layout.preferredWidth: Nheko.avatarSize - Nheko.paddingMedium
|
||||
visible: showBackButton
|
||||
image: ":/icons/icons/ui/angle-arrow-left.svg"
|
||||
image: ":/icons/icons/ui/angle-arrow-left.svg?" + Nheko.colors.light
|
||||
ToolTip.visible: hovered
|
||||
ToolTip.text: qsTr("Back to room list")
|
||||
onClicked: Rooms.resetCurrentRoom()
|
||||
|
@ -98,7 +164,7 @@ Pane {
|
|||
|
||||
Avatar {
|
||||
Layout.column: 1
|
||||
Layout.row: 0
|
||||
Layout.row: 1
|
||||
Layout.rowSpan: 2
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
width: Nheko.avatarSize
|
||||
|
@ -113,9 +179,10 @@ Pane {
|
|||
Label {
|
||||
Layout.fillWidth: true
|
||||
Layout.column: 2
|
||||
Layout.row: 0
|
||||
color: Nheko.colors.text
|
||||
Layout.row: 1
|
||||
color: Nheko.colors.brightText
|
||||
font.pointSize: fontMetrics.font.pointSize * 1.1
|
||||
font.bold: true
|
||||
text: roomName
|
||||
maximumLineCount: 1
|
||||
elide: Text.ElideRight
|
||||
|
@ -124,26 +191,56 @@ Pane {
|
|||
|
||||
MatrixText {
|
||||
id: roomTopicC
|
||||
color: Nheko.colors.brightText
|
||||
Layout.fillWidth: true
|
||||
Layout.column: 2
|
||||
Layout.row: 1
|
||||
Layout.row: 2
|
||||
Layout.maximumHeight: fontMetrics.lineSpacing * 2 // show 2 lines
|
||||
selectByMouse: false
|
||||
enabled: false
|
||||
clip: true
|
||||
text: roomTopic
|
||||
text: "<style type=\"text/css\">a { font-weight: bold; color:" + Nheko.colors.brightText + ";}</style>" + roomTopic
|
||||
}
|
||||
|
||||
ImageButton {
|
||||
id: pinButton
|
||||
|
||||
property bool pinsShown: !Settings.hiddenPins.includes(roomId)
|
||||
|
||||
visible: !!room && room.pinnedMessages.length > 0
|
||||
Layout.column: 3
|
||||
Layout.row: 1
|
||||
Layout.rowSpan: 2
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
Layout.preferredHeight: Nheko.avatarSize - Nheko.paddingMedium
|
||||
Layout.preferredWidth: Nheko.avatarSize - Nheko.paddingMedium
|
||||
image: pinsShown ? ":/icons/icons/ui/pin.svg" : ":/icons/icons/ui/pin-off.svg"
|
||||
ToolTip.visible: hovered
|
||||
ToolTip.text: qsTr("Show or hide pinned messages")
|
||||
onClicked: {
|
||||
var ps = Settings.hiddenPins;
|
||||
if (pinsShown) {
|
||||
ps.push(roomId);
|
||||
} else {
|
||||
const index = ps.indexOf(roomId);
|
||||
if (index > -1) {
|
||||
ps.splice(index, 1);
|
||||
}
|
||||
}
|
||||
Settings.hiddenPins = ps;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
AbstractButton {
|
||||
Layout.column: 3
|
||||
Layout.row: 0
|
||||
Layout.column: 4
|
||||
Layout.row: 1
|
||||
Layout.rowSpan: 2
|
||||
Layout.preferredHeight: Nheko.avatarSize - Nheko.paddingMedium
|
||||
Layout.preferredWidth: Nheko.avatarSize - Nheko.paddingMedium
|
||||
|
||||
visible: isEncrypted
|
||||
contentItem: EncryptionIndicator {
|
||||
sourceSize.height: parent.Layout.preferredHeight * Screen.devicePixelRatio
|
||||
sourceSize.width: parent.Layout.preferredWidth * Screen.devicePixelRatio
|
||||
encrypted: isEncrypted
|
||||
trust: trustlevel
|
||||
enabled: false
|
||||
|
@ -173,46 +270,44 @@ Pane {
|
|||
}
|
||||
|
||||
ImageButton {
|
||||
id: pinButton
|
||||
id: searchButton
|
||||
|
||||
property bool pinsShown: !Settings.hiddenPins.includes(roomId)
|
||||
property bool searchActive: false
|
||||
|
||||
visible: !!room && room.pinnedMessages.length > 0
|
||||
Layout.column: 4
|
||||
Layout.row: 0
|
||||
visible: !!room
|
||||
Layout.column: 5
|
||||
Layout.row: 1
|
||||
Layout.rowSpan: 2
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
Layout.preferredHeight: Nheko.avatarSize - Nheko.paddingMedium
|
||||
Layout.preferredWidth: Nheko.avatarSize - Nheko.paddingMedium
|
||||
image: pinsShown ? ":/icons/icons/ui/pin.svg" : ":/icons/icons/ui/pin-off.svg"
|
||||
image: ":/icons/icons/ui/search.svg"
|
||||
ToolTip.visible: hovered
|
||||
ToolTip.text: qsTr("Show or hide pinned messages")
|
||||
onClicked: {
|
||||
var ps = Settings.hiddenPins;
|
||||
if (pinsShown) {
|
||||
ps.push(roomId);
|
||||
} else {
|
||||
const index = ps.indexOf(roomId);
|
||||
if (index > -1) {
|
||||
ps.splice(index, 1);
|
||||
}
|
||||
}
|
||||
Settings.hiddenPins = ps;
|
||||
}
|
||||
ToolTip.text: qsTr("Search this room")
|
||||
onClicked: searchActive = !searchActive
|
||||
|
||||
onSearchActiveChanged: {
|
||||
if (searchActive) {
|
||||
searchField.forceActiveFocus();
|
||||
}
|
||||
else {
|
||||
searchField.clear();
|
||||
topBar.searchString = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ImageButton {
|
||||
id: roomOptionsButton
|
||||
|
||||
visible: !!room
|
||||
Layout.column: 5
|
||||
Layout.row: 0
|
||||
Layout.column: 6
|
||||
Layout.row: 1
|
||||
Layout.rowSpan: 2
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
Layout.preferredHeight: Nheko.avatarSize - Nheko.paddingMedium
|
||||
Layout.preferredWidth: Nheko.avatarSize - Nheko.paddingMedium
|
||||
image: ":/icons/icons/ui/options.svg"
|
||||
image: ":/icons/icons/ui/options.svg?" + Nheko.colors.light
|
||||
ToolTip.visible: hovered
|
||||
ToolTip.text: qsTr("Room options")
|
||||
onClicked: roomOptionsMenu.open(roomOptionsButton)
|
||||
|
@ -248,9 +343,9 @@ Pane {
|
|||
ScrollView {
|
||||
id: pinnedMessages
|
||||
|
||||
Layout.row: 2
|
||||
Layout.row: 3
|
||||
Layout.column: 2
|
||||
Layout.columnSpan: 3
|
||||
Layout.columnSpan: 4
|
||||
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: Math.min(contentHeight, Nheko.avatarSize * 4)
|
||||
|
@ -329,9 +424,9 @@ Pane {
|
|||
ScrollView {
|
||||
id: widgets
|
||||
|
||||
Layout.row: 3
|
||||
Layout.row: 4
|
||||
Layout.column: 2
|
||||
Layout.columnSpan: 1
|
||||
Layout.columnSpan: 4
|
||||
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: Math.min(contentHeight, Nheko.avatarSize * 1.5)
|
||||
|
@ -361,6 +456,22 @@ Pane {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
MatrixTextField {
|
||||
id: searchField
|
||||
visible: searchButton.searchActive
|
||||
enabled: visible
|
||||
hasClear: true
|
||||
|
||||
Layout.row: 5
|
||||
Layout.column: 2
|
||||
Layout.columnSpan: 4
|
||||
|
||||
Layout.fillWidth: true
|
||||
|
||||
placeholderText: qsTr("Enter search query")
|
||||
onAccepted: topBar.searchString = text
|
||||
}
|
||||
}
|
||||
|
||||
CursorShape {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -16,7 +17,7 @@ Item {
|
|||
id: typingRect
|
||||
|
||||
visible: (room && room.typingUsers.length > 0)
|
||||
color: Nheko.colors.base
|
||||
color: Nheko.colors.dark
|
||||
anchors.fill: parent
|
||||
z: 3
|
||||
|
||||
|
@ -28,7 +29,7 @@ Item {
|
|||
anchors.right: parent.right
|
||||
anchors.rightMargin: 10
|
||||
anchors.bottom: parent.bottom
|
||||
color: Nheko.colors.text
|
||||
color: Nheko.colors.brightText
|
||||
text: room ? room.formatTypingUsers(room.typingUsers, Nheko.colors.base) : ""
|
||||
textFormat: Text.RichText
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -41,15 +42,15 @@ Page {
|
|||
|
||||
background: Rectangle {
|
||||
color: Nheko.colors.window
|
||||
radius: Nheko.paddingMedium
|
||||
radius: 0
|
||||
}
|
||||
contentItem: ColumnLayout {
|
||||
Image {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
|
||||
sourceSize.height: height
|
||||
sourceSize.width: width
|
||||
sourceSize.height: parent.availableHeight - namefield.height
|
||||
sourceSize.width: parent.availableWidth
|
||||
fillMode: Image.PreserveAspectFit
|
||||
smooth: true
|
||||
mipmap: true
|
||||
|
@ -63,6 +64,7 @@ Page {
|
|||
source: (modelData.thumbnail != "") ? modelData.thumbnail : ("image://colorimage/:/icons/icons/ui/"+typeStr+".svg?" + Nheko.colors.buttonText)
|
||||
}
|
||||
MatrixTextField {
|
||||
id: namefield
|
||||
Layout.fillWidth: true
|
||||
text: modelData.filename
|
||||
onTextEdited: modelData.filename = text
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -129,7 +130,7 @@ Container {
|
|||
orientation: ListView.Horizontal
|
||||
highlightRangeMode: ListView.StrictlyEnforceRange
|
||||
interactive: singlePageMode
|
||||
highlightMoveDuration: container.singlePageMode ? 200 : 0
|
||||
highlightMoveDuration: (container.singlePageMode && !Settings.reducedMotion) ? 200 : 0
|
||||
currentIndex: container.singlePageMode ? container.pageIndex : 0
|
||||
boundsBehavior: Flickable.StopAtBounds
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -19,17 +20,6 @@ Button {
|
|||
|
||||
property string iconImage: ""
|
||||
|
||||
DropShadow {
|
||||
anchors.fill: control.background
|
||||
horizontalOffset: 3
|
||||
verticalOffset: 3
|
||||
radius: 8
|
||||
samples: 17
|
||||
cached: true
|
||||
color: "#80000000"
|
||||
source: control.background
|
||||
}
|
||||
|
||||
contentItem: RowLayout {
|
||||
spacing: 0
|
||||
anchors.centerIn: parent
|
||||
|
@ -59,7 +49,7 @@ Button {
|
|||
background: Rectangle {
|
||||
//height: control.contentItem.implicitHeight * 2
|
||||
//width: control.contentItem.implicitWidth * 2
|
||||
radius: height / 8
|
||||
radius: 0
|
||||
color: Qt.lighter(Nheko.colors.dark, control.down ? 1.4 : (control.hovered ? 1.2 : 1))
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -36,7 +37,7 @@ Dialog {
|
|||
color: Nheko.colors.window
|
||||
border.color: Nheko.theme.separator
|
||||
border.width: 1
|
||||
radius: Nheko.paddingSmall
|
||||
radius: 0
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -19,7 +20,7 @@ Rectangle {
|
|||
visible: mayBeVisible && notificationCount > 0
|
||||
implicitHeight: notificationBubbleText.height + Nheko.paddingMedium
|
||||
implicitWidth: Math.max(notificationBubbleText.width, height)
|
||||
radius: height / 2
|
||||
radius: 0
|
||||
color: hasLoudNotification ? Nheko.theme.red : bubbleBackgroundColor
|
||||
ToolTip.text: notificationCount
|
||||
ToolTip.delay: Nheko.tooltipDelay
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -52,7 +53,7 @@ Item {
|
|||
color: dragArea.held ? Nheko.colors.highlight : Nheko.colors.base
|
||||
Behavior on color { ColorAnimation { duration: 100 } }
|
||||
|
||||
radius: 2
|
||||
radius: 0
|
||||
|
||||
Drag.active: dragArea.held
|
||||
Drag.source: dragArea
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -13,7 +14,7 @@ Platform.Menu {
|
|||
property Component childMenu
|
||||
|
||||
property int position: modelData == undefined ? -2 : modelData.treeIndex
|
||||
title: modelData != undefined ? modelData.name : qsTr("Add or remove from space")
|
||||
title: modelData != undefined ? modelData.name : qsTr("Add or remove from community")
|
||||
property bool loadChildren: false
|
||||
|
||||
onAboutToShow: loadChildren = true
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import ".."
|
||||
import QtQuick 2.12
|
||||
import QtQuick.Controls 2.12
|
||||
import QtQuick.Layouts 1.12
|
||||
import im.nheko 1.0
|
||||
|
||||
ItemDelegate {
|
||||
property alias bgColor: background.color
|
||||
property alias userid: avatar.userid
|
||||
property alias displayName: avatar.displayName
|
||||
property string avatarUrl
|
||||
implicitHeight: layout.implicitHeight + Nheko.paddingSmall * 2
|
||||
background: Rectangle {id: background}
|
||||
GridLayout {
|
||||
id: layout
|
||||
anchors.centerIn: parent
|
||||
width: parent.width - Nheko.paddingSmall * 2
|
||||
rows: 2
|
||||
columns: 2
|
||||
rowSpacing: Nheko.paddingSmall
|
||||
columnSpacing: Nheko.paddingMedium
|
||||
|
||||
Avatar {
|
||||
id: avatar
|
||||
Layout.rowSpan: 2
|
||||
Layout.preferredWidth: Nheko.avatarSize
|
||||
Layout.preferredHeight: Nheko.avatarSize
|
||||
Layout.alignment: Qt.AlignLeft
|
||||
url: avatarUrl.replace("mxc://", "image://MxcImage/")
|
||||
enabled: false
|
||||
}
|
||||
Label {
|
||||
Layout.fillWidth: true
|
||||
text: displayName
|
||||
color: TimelineManager.userColor(userid, Nheko.colors.window)
|
||||
font.pointSize: fontMetrics.font.pointSize
|
||||
}
|
||||
|
||||
Label {
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignTop
|
||||
text: userid
|
||||
color: Nheko.colors.buttonText
|
||||
font.pointSize: fontMetrics.font.pointSize * 0.9
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -15,7 +16,7 @@ Rectangle {
|
|||
required property int encryptionError
|
||||
required property string eventId
|
||||
|
||||
radius: fontMetrics.lineSpacing / 2 + Nheko.paddingMedium
|
||||
radius: 0
|
||||
width: parent.width? parent.width : 0
|
||||
implicitWidth: encryptedText.implicitWidth+24+Nheko.paddingMedium*3 // Column doesn't provide a useful implicitWidth, should be replaced by ColumnLayout
|
||||
height: contents.implicitHeight + Nheko.paddingMedium * 2
|
||||
|
|
|
@ -0,0 +1,60 @@
|
|||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import ".."
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
import QtQuick.Layouts 1.15
|
||||
import im.nheko 1.0
|
||||
|
||||
Rectangle {
|
||||
id: r
|
||||
|
||||
required property string username
|
||||
|
||||
radius: 0
|
||||
width: parent.width ? Math.min(parent.width, 700) : 0
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
height: contents.implicitHeight + Nheko.paddingMedium * 2
|
||||
color: Nheko.colors.alternateBase
|
||||
border.color: Nheko.theme.green
|
||||
border.width: 2
|
||||
|
||||
RowLayout {
|
||||
id: contents
|
||||
|
||||
anchors.fill: parent
|
||||
anchors.margins: Nheko.paddingMedium
|
||||
spacing: Nheko.paddingMedium
|
||||
|
||||
Image {
|
||||
source: "image://colorimage/:/icons/icons/ui/shield-filled-checkmark.svg?" + Nheko.theme.green
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
width: 24
|
||||
height: width
|
||||
}
|
||||
|
||||
Column {
|
||||
spacing: Nheko.paddingSmall
|
||||
Layout.fillWidth: true
|
||||
|
||||
MatrixText {
|
||||
text: qsTr("%1 enabled end-to-end encryption").arg(r.username)
|
||||
font.bold: true
|
||||
font.pointSize: 14
|
||||
color: Nheko.colors.text
|
||||
width: parent.width
|
||||
}
|
||||
|
||||
MatrixText {
|
||||
text: qsTr("Encryption keeps your messages safe by only allowing the people you sent the message to to read it. For extra security, if you want to make sure you are talking to the right people, you can verify them in real life.")
|
||||
color: Nheko.colors.text
|
||||
width: parent.width
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
@ -28,10 +29,10 @@ Item {
|
|||
Rectangle {
|
||||
id: button
|
||||
|
||||
color: Nheko.colors.light
|
||||
radius: 22
|
||||
height: 44
|
||||
width: 44
|
||||
color: Nheko.colors.base
|
||||
radius: 0
|
||||
height: 36
|
||||
width: 36
|
||||
|
||||
Image {
|
||||
id: img
|
||||
|
@ -42,7 +43,7 @@ Item {
|
|||
sourceSize.width: 40
|
||||
|
||||
anchors.centerIn: parent
|
||||
source: "qrc:/icons/icons/ui/download.svg"
|
||||
source: "qrc:/icons/icons/ui/download.svg?"+Nheko.colors.brightText
|
||||
fillMode: Image.Pad
|
||||
}
|
||||
|
||||
|
@ -68,7 +69,7 @@ Item {
|
|||
text: filename
|
||||
textFormat: Text.PlainText
|
||||
elide: Text.ElideRight
|
||||
color: Nheko.colors.text
|
||||
color: Nheko.colors.brightText
|
||||
}
|
||||
|
||||
Text {
|
||||
|
@ -78,7 +79,7 @@ Item {
|
|||
text: filesize
|
||||
textFormat: Text.PlainText
|
||||
elide: Text.ElideRight
|
||||
color: Nheko.colors.text
|
||||
color: Nheko.colors.brightText
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -86,9 +87,9 @@ Item {
|
|||
}
|
||||
|
||||
Rectangle {
|
||||
color: Nheko.colors.alternateBase
|
||||
color: Nheko.colors.base
|
||||
z: -1
|
||||
radius: 10
|
||||
radius: 0
|
||||
anchors.fill: parent
|
||||
visible: !Settings.bubbles // the bubble in a bubble looks odd
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
// SPDX-FileCopyrightText: 2023 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
|