diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a58bf885..9d6fee3c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -76,9 +76,6 @@ build-macos:
stage: build
tags: [macos]
before_script:
- #- brew update
- #- brew reinstall --force python3
- #- brew bundle --file=./.ci/macos/Brewfile --force --cleanup
- rm -rf ../.hunter && mv .hunter ../.hunter || true
script:
- export PATH=/usr/local/opt/qt@5/bin/:${PATH}
@@ -112,6 +109,7 @@ codesign-macos:
stage: deploy
tags: [macos]
before_script:
+ - 'brew upgrade qt@5'
- pip3 install dmgbuild
script:
- export PATH=/usr/local/opt/qt@5/bin/:${PATH}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index aa769416..e24f7c30 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,50 @@
# Changelog
+## [0.9.3] -- 2022-03-25
+
+### Highlights
+
+- New upload UX
+ - Queue multiple uploads by pasting or dragging multiple files.
+ - Videos will now properly have a thumbnail as well as images.
+ - Duration, width and height is now also properly included so that clients can resize appropriately.
+ - Thumbnails are excluded if they are bigger than the original image. (tastytea)
+- Improvements for mobile devices (Malte E)
+ - You should now be able to scroll by touching anywhere with no random dead zones.
+ - Preedit text can now be used in a completer and is properly sent
+ - If an input method is active, pressing Enter will not send the current message.
+
+### Features
+
+- Optionally always open videos and images in an external program. (math)
+
+### Improvements
+
+- Build macOS releases against Qt 5.15.3 to resolve missing spaces after some punctuation.
+- Send the shortcode as the body for stickers without a body.
+- Elide long usernames in the timeline. (Malte E)
+- Cleanup the reply popup. (Malte E)
+- Use standard buttons where possible. (tastytea)
+- Various improvements to the bubble layout. (Malte E)
+- Enable online key backup by default.
+- Update the bundled gstreamer in our Flatpaks.
+
+### Translations
+
+- Indonesian (Linerly)
+- Estonian (Priit)
+- Finnish (Priit)
+- Esperanto (Tirifto)
+
+### Bugfixes
+
+- Fix hovering the action menu.
+- Try to avoid using unknown UIA flows.
+- Don't Components actively in use.
+- Fix screensharing.
+- Fix device id when doing SSO logins.
+
+
## [0.9.2] -- 2022-03-09
### Highlights
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 550a3aa4..7594d22b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -106,7 +106,7 @@ include(GNUInstallDirs)
set(CPACK_PACKAGE_VERSION_MAJOR "0")
set(CPACK_PACKAGE_VERSION_MINOR "9")
-set(CPACK_PACKAGE_VERSION_PATCH "2")
+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})
diff --git a/appveyor.yml b/appveyor.yml
index 0ceaab79..6125ae7c 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -31,8 +31,8 @@ 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.9.2
- - if "%APPVEYOR_REPO_TAG%"=="false" set VERSION=0.9.2
+ - if "%APPVEYOR_REPO_TAG%"=="false" set INSTVERSION=0.9.3
+ - if "%APPVEYOR_REPO_TAG%"=="false" set VERSION=0.9.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
@@ -94,8 +94,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.9.2/" installer\config\config.xml
- - sed -i "s/__VERSION__/0.9.2/" installer\packages\io.github.nhekoreborn.nheko\meta\package.xml
+ - sed -i "s/__VERSION__/0.9.3/" installer\config\config.xml
+ - sed -i "s/__VERSION__/0.9.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
diff --git a/resources/langs/nheko_et.ts b/resources/langs/nheko_et.ts
index dd2b84f7..f5b94702 100644
--- a/resources/langs/nheko_et.ts
+++ b/resources/langs/nheko_et.ts
@@ -1231,7 +1231,7 @@ Näiteks: https://server.minu:8787
- Meediafailide üleslaadimine ei õnnestunud. Palun proovi uuesti.
+ Meediafailide üleslaadimine ei õnnestunud. Palun proovi uuesti.
@@ -2820,9 +2820,9 @@ Põhjus: %4
-
-
-
+
+ Laadi fail üles
+ Laadi %n faili üles
@@ -3393,13 +3393,15 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim
-
+ Pildile klõpsimisel avab need välises rakenduses.
+Kui see valik on sisse lülitatud, siis failid jäävad andmekandjale krüptimata kujul ning sa pead neid eraldi kustutama.
-
+ Videole klõpsimisel avab need välises rakenduses.
+Kui see valik on sisse lülitatud, siis failid jäävad andmekandjale krüptimata kujul ning sa pead neid eraldi kustutama.
diff --git a/resources/langs/nheko_fr.ts b/resources/langs/nheko_fr.ts
index 2d025f83..0049dc9f 100644
--- a/resources/langs/nheko_fr.ts
+++ b/resources/langs/nheko_fr.ts
@@ -95,12 +95,12 @@
- Microphone inconnu : %1
+ Microphone inconnu : %1
- Caméra inconnue : %1
+ Caméra inconnue : %1
@@ -147,7 +147,7 @@
- Impossible d'ouvrir la base de données, déconnexion !
+ Impossible d'ouvrir la base de données, déconnexion !
@@ -173,12 +173,12 @@
- Voulez-vous vraiment inviter %1 (%2) ?
+ Voulez-vous vraiment inviter %1 (%2) ?
- Échec de l'invitation de %1 dans %2 : %3
+ Échec de l'invitation de %1 dans %2 : %3
@@ -203,12 +203,12 @@
- Voulez-vous vraiment annuler le bannissement de %1 (%2) ?
+ Voulez-vous vraiment annuler le bannissement de %1 (%2) ?
- Échec de l'annulation du bannissement de %1 dans %2 : %3
+ Échec de l'annulation du bannissement de %1 dans %2 : %3
@@ -223,7 +223,7 @@
- Échec de la migration du cache !
+ Échec de la migration du cache !
@@ -245,18 +245,18 @@
- Échec de la configuration des clés de chiffrement. Réponse du serveur : %1 %2. Veuillez réessayer plus tard.
+ Échec de la configuration des clés de chiffrement. Réponse du serveur : %1 %2. Veuillez réessayer plus tard.
- Veuillez re-tenter vous reconnecter : %1
+ Veuillez re-tenter vous reconnecter : %1
- Impossible de rejoindre le salon : %1
+ Impossible de rejoindre le salon : %1
@@ -266,42 +266,42 @@
- Impossible de supprimer l'invitation : %1
+ Impossible de supprimer l'invitation : %1
- Échec de la création du salon : %1
+ Échec de la création du salon : %1
- Impossible de quitter le salon : %1
+ Impossible de quitter le salon : %1
-
+ Motif de l’expulsion
-
+ Saisissez le motif de l'expulsion de %1 (%2), ou appuyez sur entrée pour l'omettre :
- Échec de l'expulsion de %1 de %2 : %3
+ Échec de l'expulsion de %1 de %2 : %3
-
+ Motif du bannissement
-
+ Saisissez le motif du bannissement de %1 (%2), ou appuyez sur entrée pour l'omettre :
@@ -390,12 +390,12 @@
- Entrez votre clé de récupération ou phrase de passe pour déchiffrer vos secrets :
+ Entrez votre clé de récupération ou phrase de passe pour déchiffrer vos secrets :
- Entrez votre clé de récupération ou votre phrase de passe nommée %1 pour déchiffrer vos secrets :
+ Entrez votre clé de récupération ou votre phrase de passe nommée %1 pour déchiffrer vos secrets :
@@ -418,17 +418,17 @@
- Veuillez vérifier les chiffres suivants. Vous devriez voir les mêmes chiffres des deux côtés. Si ceux-ci diffèrent, veuillez choisir « Ils sont différents ! » pour annuler la vérification !
+ Veuillez vérifier les chiffres suivants. Vous devriez voir les mêmes chiffres des deux côtés. Si ceux-ci diffèrent, veuillez choisir « Ils sont différents ! » pour annuler la vérification !
- Ils sont différents !
+ Ils sont différents !
- Ils sont identiques !
+ Ils sont identiques !
@@ -436,12 +436,12 @@
- Configuration du salon
+ Configuration du salon
-
+ %n membre%n membres
@@ -449,133 +449,134 @@
- CONFIGURATION
+ CONFIGURATION
- Notifications
+ Notifications
- En sourdine
+ En sourdine
- Seulement les mentions
+ Seulement les mentions
- Tous les messages
+ Tous les messages
- Accès au salon
+ Accès au salon
- Tous le monde et les invités
+ Tous le monde et les invités
- Tout le monde
+ Tout le monde
- Utilisateurs invités
+ Utilisateurs invités
- En toquant
+ En toquant
- Restreint par l'appartenance à d'autre salons
+ Restreint par l'appartenance à d'autre salons
- Chiffrement
+ Chiffrement
- Chiffrement bout-à-bout
+ Chiffrement de bout en bout
-
+ Le chiffrement est expérimental pour le moment, à vos risques et périls. <br>
+Veuillez noter qu'il ne pourra plus être désactivé par la suite.
- Paramètres des autocollants & emotes
+ Paramètres des autocollants & emotes
- Modifier
+ Modifier
- Modifier quels paquets sont activés, retirer des paquets ou bien en créer de nouveaux
+ Modifier quels paquets sont activés, supprimer des paquets, en créer des nouveaux
- Évènements cachés
+ Évènements cachés
- Configurer
+ Configurer
- Sélectionner les évènements à cacher dans ce salon
+ Sélectionnez les évènements à cacher dans ce salon
- INFO
+ INFO
- Identifiant interne
+ Identifiant interne
-
+ Copié dans le presse-papiers
- Version du salon
+ Version du salon
-
+ montrer moins
-
+ montrer plus
@@ -659,17 +660,17 @@
- Veuillez vérifier les émoji suivants. Vous devriez voir les mêmes émoji des deux côtés. S'ils diffèrent, veuillez choisir « Ils sont différents ! » pour annuler la vérification !
+ Veuillez vérifier les émoji suivants. Vous devriez voir les mêmes émoji des deux côtés. S'ils diffèrent, veuillez choisir « Ils sont différents ! » pour annuler la vérification !
- Ils sont différents !
+ Ils sont différents !
- Ils sont identiques !
+ Ils sont identiques !
@@ -720,7 +721,7 @@
- Ce message n'est pas chiffré !
+ Ce message n'est pas chiffré !
@@ -753,7 +754,7 @@
- Clés non correspondantes détectées !
+ Clés non correspondantes détectées !
@@ -768,7 +769,7 @@
- Messages de vérification reçus dans le désordre !
+ Messages de vérification reçus dans le désordre !
@@ -813,12 +814,12 @@
-
+ Ces évènements seront <b>affichés</b> dans %1 :
-
+ Ces évènements seront <b>affichés</b> dans tous les salons :
@@ -1080,9 +1081,9 @@
You can also put your homeserver address there, if your server doesn't support .well-known lookup.
Example: @user:server.my
If Nheko fails to discover your homeserver, it will show you a field to enter the server manually.
- Votre nom de connexion. Un mxid doit commencer par un « @ » suivi de l'identifiant. L'identifiant doit être suivi du nom de serveur, séparé de celui-ci par « : ».
+ Votre nom de connexion. Un mxid doit commencer par un « @ » suivi de l'identifiant. L'identifiant doit être suivi du nom de serveur, séparé de celui-ci par « : ».
Vous pouvez également spécifier l'adresse de votre serveur ici, si votre serveur ne supporte pas l'identification .well-known.
-Exemple : @utilisateur :monserveur.example.com
+Exemple : @utilisateur :monserveur.example.com
Si Nheko n'arrive pas à trouver votre serveur, il vous proposera de l'indiquer manuellement.
@@ -1120,7 +1121,7 @@ Si Nheko n'arrive pas à trouver votre serveur, il vous proposera de l&apos
L'adresse qui peut être utilisée pour joindre l'API client de votre serveur.
-Exemple : https ://monserveur.example.com:8787
+Exemple : https ://monserveur.example.com:8787
@@ -1138,7 +1139,7 @@ Exemple : https ://monserveur.example.com:8787
- Vous avez entré un identifiant Matrix invalide exemple correct : @moi:monserveur.example.com)
+ Vous avez entré un identifiant Matrix invalide exemple correct : @moi:monserveur.example.com)
@@ -1168,27 +1169,27 @@ Exemple : https ://monserveur.example.com:8787
-
+ Se connecter avec Apple
-
+ Continuer avec Facebook
-
+ Connexion avec Google
-
+ Connexion avec Twitter
-
+ Connexion avec %1
@@ -1216,12 +1217,12 @@ Exemple : https ://monserveur.example.com:8787
- Un appel est en cours. Se déconnecter ?
+ Un appel est en cours. Se déconnecter ?
- Êtes-vous certain de vouloir vous déconnecter ?
+ Êtes-vous certain de vouloir vous déconnecter ?
@@ -1230,7 +1231,7 @@ Exemple : https ://monserveur.example.com:8787
- Échec de l'envoi du média. Veuillez réessayer.
+ Échec de l'envoi du média. Veuillez réessayer.
@@ -1293,7 +1294,7 @@ Exemple : https ://monserveur.example.com:8787
- %1 a créé et configuré le salon : %2
+ %1 a créé et configuré le salon : %2
@@ -1399,12 +1400,12 @@ Exemple : https ://monserveur.example.com:8787
-
+ Raison de la suppression
-
+ Entrez la raison de la suppression, ou appuyez sur entrée pour l'omettre :
@@ -1509,12 +1510,12 @@ Exemple : https ://monserveur.example.com:8787
- Pour permettre à d'autres utilisateurs de confirmer qu'un appareil est vraiment le vôtre, vous pouvez le vérifier. Cela permet également aux sauvegardes de clés de déchiffrement de fonctionner automatiquement sur ces appareils, pour ne pas perdre vos messages chiffrés. Vérifier un appareil maintenant ? (Vérifiez que celui-ci est à proximité).
+ Pour permettre à d'autres utilisateurs de confirmer qu'un appareil est vraiment le vôtre, vous pouvez le vérifier. Cela permet également aux sauvegardes de clés de déchiffrement de fonctionner automatiquement sur ces appareils, pour ne pas perdre vos messages chiffrés. Vérifier un appareil maintenant ? (Vérifiez que celui-ci est à proximité).
- Pour permettre aux autres utilisateurs de vérifier quels appareils de votre compte sont réellement les vôtres, vous pouvez les vérifier. Cela permet également à la sauvegarde des clés de fonctionner automatiquement. Vérifier %1 maintenant ?
+ Pour permettre aux autres utilisateurs de vérifier quels appareils de votre compte sont réellement les vôtres, vous pouvez les vérifier. Cela permet également à la sauvegarde des clés de fonctionner automatiquement. Vérifier %1 maintenant ?
@@ -1602,7 +1603,7 @@ Exemple : https ://monserveur.example.com:8787
- Appeler %1 ?
+ Appeler %1 ?
@@ -1635,7 +1636,7 @@ Exemple : https ://monserveur.example.com:8787
- Évènement non implémenté :
+ Évènement non implémenté :
@@ -1801,7 +1802,7 @@ Exemple : https ://monserveur.example.com:8787
-
+ Annuler les modifications
@@ -1850,7 +1851,7 @@ Exemple : https ://monserveur.example.com:8787
- Étiqueter le salon comme :
+ Étiqueter le salon comme :
@@ -2077,7 +2078,8 @@ Exemple : https ://monserveur.example.com:8787
-
+ Le chiffrement est expérimental pour le moment, à vos risques et périls. <br>
+Veuillez noter qu'il ne pourra plus être désactivé par la suite.
@@ -2122,7 +2124,7 @@ Exemple : https ://monserveur.example.com:8787
-
+ Copié dans le presse-papiers
@@ -2132,17 +2134,17 @@ Exemple : https ://monserveur.example.com:8787
-
+ montrer moins
-
+ montrer plus
- Échec de l'activation du chiffrement : %1
+ Échec de l'activation du chiffrement : %1
@@ -2162,13 +2164,13 @@ Exemple : https ://monserveur.example.com:8787
- Erreur lors de la lecture du fichier : %1
+ Erreur lors de la lecture du fichier : %1
- Échec de l'envoi de l'image : %s
+ Échec de l'envoi de l'image : %s
@@ -2194,22 +2196,22 @@ Exemple : https ://monserveur.example.com:8787
- Veuillez saisir votre mot de passe pour continuer :
+ Veuillez saisir votre mot de passe pour continuer :
- Veuillez saisir un courriel valide pour continuer :
+ Veuillez saisir un courriel valide pour continuer :
- Veuillez saisir un numéro de téléphone valide pour continuer :
+ Veuillez saisir un numéro de téléphone valide pour continuer :
- Veuillez entrer le jeton qui vous a été envoyé :
+ Veuillez entrer le jeton qui vous a été envoyé :
@@ -2222,17 +2224,17 @@ Exemple : https ://monserveur.example.com:8787
- Partager le bureau avec %1 ?
+ Partager le bureau avec %1 ?
- Fenêtre :
+ Fenêtre :
- Fréquence d'images :
+ Fréquence d'images :
@@ -2281,7 +2283,7 @@ Exemple : https ://monserveur.example.com:8787
- Nheko n'a pas pu se connecter au stockage sécurisé afin d'y sauvegarder les clés de chiffrement. Cela peut avoir différentes causes. Vérifiez si votre service D-Bus est lancé, et si vous avez configuré un service tel que KWallet ; Gnome Keyring ; KeePassXC ou l'équivalent pour votre système. Si vous n'arrivez pas à résoudre le problème, n'hésitez pas à nous en faire part ici : https ://github.com/Nheko-Reborn/nheko/issues
+ Nheko n'a pas pu se connecter au stockage sécurisé afin d'y sauvegarder les clés de chiffrement. Cela peut avoir différentes causes. Vérifiez si votre service D-Bus est lancé, et si vous avez configuré un service tel que KWallet ; Gnome Keyring ; KeePassXC ou l'équivalent pour votre système. Si vous n'arrivez pas à résoudre le problème, n'hésitez pas à nous en faire part ici : https ://github.com/Nheko-Reborn/nheko/issues
@@ -2289,7 +2291,7 @@ Exemple : https ://monserveur.example.com:8787
- Ceci est votre clé de récupération. Vous en aurez besoin afin de restaurer l'accès à vos messages chiffrés et à vos clés de vérification. Gardez cette clé en sûreté. Ne la partagez pas avec qui que ce soit et ne la perdez pas ! Ne passez pas par la case départ et ne recevez pas 20 000 francs !
+ Ceci est votre clé de récupération. Vous en aurez besoin afin de restaurer l'accès à vos messages chiffrés et à vos clés de vérification. Gardez cette clé en sûreté. Ne la partagez pas avec qui que ce soit et ne la perdez pas ! Ne passez pas par la case départ et ne recevez pas 20 000 francs !
@@ -2299,7 +2301,7 @@ Exemple : https ://monserveur.example.com:8787
- Échec de la configuration du chiffrement : %1
+ Échec de la configuration du chiffrement : %1
@@ -2310,8 +2312,8 @@ Exemple : https ://monserveur.example.com:8787
- Bonjour et bienvenue sur le réseau Matrix !
-Il semblerait que ce soit votre première fois ici. Avant de pouvoir chiffrer vos messages de manière sécurisée, nous devons configurer quelques détails. Vous pouvez soit accepter immédiatement, soit ajuster quelques options basiques. Nous essayons également d'expliquer le fonctionnement de certains mécanismes. Vous pouvez sauter ces étapes, mais celles-ci pourraient se montrer utiles par la suite !
+ Bonjour et bienvenue sur le réseau Matrix !
+Il semblerait que ce soit votre première fois ici. Avant de pouvoir chiffrer vos messages de manière sécurisée, nous devons configurer quelques détails. Vous pouvez soit accepter immédiatement, soit ajuster quelques options basiques. Nous essayons également d'expliquer le fonctionnement de certains mécanismes. Vous pouvez sauter ces étapes, mais celles-ci pourraient se montrer utiles par la suite !
@@ -2341,17 +2343,17 @@ Si vous choisissez de vérifier, vous aurez besoin de l'autre appareil. Si
- Échec de la création des clés pour l'auto-vérification (cross-signing) !
+ Échec de la création des clés pour l'auto-vérification (cross-signing) !
- Échec de la création de clés pour la sauvegarde en ligne !
+ Échec de la création de clés pour la sauvegarde en ligne !
- Échec de la création des clés pour le stockage sécurisé côté serveur !
+ Échec de la création des clés pour le stockage sécurisé côté serveur !
@@ -2361,7 +2363,7 @@ Si vous choisissez de vérifier, vous aurez besoin de l'autre appareil. Si
- Échec de la configuration du chiffrement : %1
+ Échec de la configuration du chiffrement : %1
@@ -2436,7 +2438,7 @@ Si vous choisissez de vérifier, vous aurez besoin de l'autre appareil. Si
- Vérification réussie ! Les deux côtés ont vérifié leur appareil !
+ Vérification réussie ! Les deux côtés ont vérifié leur appareil !
@@ -2450,13 +2452,13 @@ Si vous choisissez de vérifier, vous aurez besoin de l'autre appareil. Si
- Échec de la suppression du message : %1
+ Échec de la suppression du message : %1
- Échec du chiffrement de l'évènement, envoi abandonné !
+ Échec du chiffrement de l'évènement, envoi abandonné !
@@ -2648,7 +2650,7 @@ Raison : %4
This is a leave event after the user already left and shouldn't happen apart from state resets
- %1 a quitté le salon après l'avoir déjà quitté !
+ %1 a quitté le salon après l'avoir déjà quitté !
@@ -2818,9 +2820,9 @@ Raison : %4
-
-
-
+
+ Mettre en ligne un fichier
+ Mettre en ligne %n fichiers
@@ -2945,7 +2947,7 @@ Raison : %4
- Erreur lors de la lecture du fichier : %1
+ Erreur lors de la lecture du fichier : %1
@@ -3062,12 +3064,12 @@ Raison : %4
-
+ Ouvrir les images avec un programme externe
-
+ Ouvrir les vidéos avec un programme externe
@@ -3361,18 +3363,19 @@ Le statut est affiché près de la date des messages.
-
+ Notifier des messages reçus quand le client n'est pas la fenêtre active.
-
+ Changer l'apparence des images de profil dans les discussions.
+OFF - carré, ON - circulaire.
-
+ La clef pour vérifier vos propres appareils. Si elle est en cache, vérifier un de vos appareils le marquera comme vérifié pour tous vos autres appareils et pour les utilisateurs qui vous ont vérifié.
@@ -3390,13 +3393,15 @@ Typiquement, l'icône de l'application est mise en évidence dans la b
-
+ Ouvre les images avec un programme externe au clic de l'image.
+Notez que si cette option est activée, les fichiers sont laissés déchiffrés sur le disque et doivent être supprimés manuellement.
-
+ Ouvre les vidéos avec un programme externe au clic de la vidéo.
+Notez que si cette option est activée, les fichiers sont laissés déchiffrés sur le disque et doivent être supprimés manuellement.
@@ -3490,7 +3495,7 @@ be blurred.
- Entrez la phrase de passe pour déchiffrer le fichier :
+ Entrez la phrase de passe pour déchiffrer le fichier :
@@ -3501,7 +3506,7 @@ be blurred.
- Entrez une phrase de passe pour chiffrer vos clés de session :
+ Entrez une phrase de passe pour chiffrer vos clés de session :
@@ -3788,12 +3793,12 @@ be blurred.
- Vous : %1
+ Vous : %1
- %1 : %2
+ %1 : %2
diff --git a/resources/langs/nheko_id.ts b/resources/langs/nheko_id.ts
index 0d955d53..04f8b368 100644
--- a/resources/langs/nheko_id.ts
+++ b/resources/langs/nheko_id.ts
@@ -1229,7 +1229,7 @@ Misalnya: https://server.my:8787
- Gagal untuk mengunggah media. Silakan coba lagi.
+ Gagal untuk mengunggah media. Silakan coba lagi.
@@ -2815,8 +2815,8 @@ Alasan: %4
-
-
+
+ Unggah %n file
@@ -3387,13 +3387,15 @@ Ini biasanya menyebabkan ikon aplikasi di bilah tugas untuk beranimasi.
-
+ Membuka gambar dengan sebuah program eksternal ketika mengetuk pada gambar.
+Dicatat bahwa ketika opsi ini NYALA, file yang terbuka ditinggal tidak terenkripsi pada disk dan harus dihapus secara manual.
-
+ Membuka video dengan sebuah program eksternal ketika mengetuk pada video.
+Dicatat bahwa ketika opsi ini NYALA, file yang terbuka ditinggal tidak terenkripsi pada disk dan harus dihapus secara manual.
diff --git a/resources/langs/nheko_nl.ts b/resources/langs/nheko_nl.ts
index b80ba972..194c9e88 100644
--- a/resources/langs/nheko_nl.ts
+++ b/resources/langs/nheko_nl.ts
@@ -436,12 +436,12 @@
- Kamerinstellingen
+ Kamerinstellingen
-
+ %n deelnemer%n deelnemers
@@ -449,134 +449,134 @@
- INSTELLINGEN
+ INSTELLINGEN
- Meldingen
+ Meldingen
- Gedempt
+ Gedempt
- Alleen vermeldingen
+ Alleen vermeldingen
- Alle berichten
+ Alle berichten
- Kamertoegang
+ Kamertoegang
- Iedereen (inclusief gasten)
+ Iedereen (inclusief gasten)
- Iedereen
+ Iedereen
- Uitgenodigde gebruikers
+ Uitgenodigde gebruikers
- Door aan te kloppen
+ Door aan te kloppen
- Beperkt door deelname aan andere kamers
+ Beperkt door deelname aan andere kamers
- Versleuteling
+ Versleuteling
- Eind-tot-eind versleuteling
+ Eind-tot-eind versleuteling
- Versleuteling is momenteel experimenteel en dingen gaan misschien stuk. <br>
+ Versleuteling is momenteel experimenteel en dingen gaan misschien stuk. <br>
Wees ervan bewust dat het achteraf niet meer uitgeschakeld kan worden.
- Sticker & Emoji instellingen
+ Sticker & Emoji instellingen
- Bewerken
+ Bewerken
- Verander welke afbeeldingspakketten zijn ingeschakeld, verwijder ze of voeg nieuwe toe
+ Verander welke afbeeldingspakketten zijn ingeschakeld, verwijder ze of voeg nieuwe toe
- Verborgen gebeurtenissen
+ Verborgen gebeurtenissen
- Instellen
+ Instellen
- Selecteer gebeurtenissen die verborgen dienen te worden in deze kamer
+ Selecteer gebeurtenissen die verborgen dienen te worden in deze kamer
- INFO
+ INFO
- Interne ID
+ Interne ID
- Gekopieerd naar klembord
+ Gekopieerd naar klembord
- Kamerversie
+ Kamerversie
-
+ minder tonen
-
+ meer tonen
@@ -1231,7 +1231,7 @@ Voorbeeld: https://mijnserver.nl:8787
- Het is niet is gelukt om de media te versturen. Probeer het a.u.b. opnieuw.
+ Het is niet is gelukt om de media te versturen. Probeer het a.u.b. opnieuw.
@@ -1802,7 +1802,7 @@ Voorbeeld: https://mijnserver.nl:8787
-
+ Bewerken annuleren
@@ -2134,12 +2134,12 @@ Wees ervan bewust dat het achteraf niet meer uitgeschakeld kan worden.
-
+ minder tonen
-
+ meer tonen
@@ -2820,9 +2820,9 @@ Reden: %4
-
-
-
+
+ Bestand versturen
+ %n bestanden versturen
@@ -3064,12 +3064,12 @@ Reden: %4
-
+ Open afbeeldingen met externe applicatie
-
+ Open videos met externe applicatie
@@ -3393,13 +3393,15 @@ Meestal zorgt dit dat het icoon in de taakbalk op een manier animeert of iets de
-
+ Opent afbeeldingen met een externe applicatie wanneer op een afbeelding geklikt wordt.
+Let up dat als deze instelling AAN staat, geopende afbeeldingen zonder versleuteling opgeslagen worden en met de hand moeten worden opgeruimd.
-
+ Opent videos met een externe applicatie wanneer op een afbeelding geklikt wordt.
+Let up dat als deze instelling AAN staat, geopende videos zonder versleuteling opgeslagen worden en met de hand moeten worden opgeruimd.
diff --git a/resources/nheko.appdata.xml b/resources/nheko.appdata.xml
index 597d7b9c..5aafdc6d 100644
--- a/resources/nheko.appdata.xml
+++ b/resources/nheko.appdata.xml
@@ -56,7 +56,8 @@
https://github.com/Nheko-Reborn/nhekohttps://github.com/Nheko-Reborn
-
+
+
diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml
index e5dd91b9..3763c24a 100644
--- a/resources/qml/MessageView.qml
+++ b/resources/qml/MessageView.qml
@@ -68,7 +68,7 @@ Item {
hoverEnabled: true
visible: Settings.buttonsInTimeline && !!attached && (attached.hovered || hovered)
x: attached ? attachedPos.x : 0
- y: attached ? attachedPos.y + Nheko.paddingMedium : 0
+ y: attached ? attachedPos.y + Nheko.paddingSmall : 0
z: 10
background: Rectangle {
@@ -362,7 +362,7 @@ Item {
}
- delegate: ItemDelegate {
+ delegate: Item {
id: wrapper
required property double proportionalHeight
@@ -407,55 +407,6 @@ Item {
width: chat.delegateMaxWidth
height: section.active ? section.height + timelinerow.height : timelinerow.height
- hoverEnabled: true
-
- background: Rectangle {
- id: scrollHighlight
-
- opacity: 0
- visible: true
- z: 1
- enabled: false
- color: Nheko.colors.highlight
-
- states: State {
- name: "revealed"
- when: wrapper.scrolledToThis
- }
-
- transitions: Transition {
- from: ""
- to: "revealed"
-
- SequentialAnimation {
- PropertyAnimation {
- target: scrollHighlight
- properties: "opacity"
- easing.type: Easing.InOutQuad
- from: 0
- to: 1
- duration: 500
- }
-
- PropertyAnimation {
- target: scrollHighlight
- properties: "opacity"
- easing.type: Easing.InOutQuad
- from: 1
- to: 0
- duration: 500
- }
-
- ScriptAction {
- script: chat.model.eventShown()
- }
-
- }
-
- }
-
- }
-
Loader {
id: section
@@ -480,8 +431,6 @@ Item {
TimelineRow {
id: timelinerow
- hovered: messageActions.hovered ? (messageActions.model != undefined && messageActions.model == timelinerow) : wrapper.hovered
-
proportionalHeight: wrapper.proportionalHeight
type: chat.model, wrapper.type
typeString: wrapper.typeString
@@ -523,7 +472,52 @@ Item {
}
}
}
+ background: Rectangle {
+ id: scrollHighlight
+ opacity: 0
+ visible: true
+ z: 1
+ enabled: false
+ color: Nheko.colors.highlight
+
+ states: State {
+ name: "revealed"
+ when: wrapper.scrolledToThis
+ }
+
+ transitions: Transition {
+ from: ""
+ to: "revealed"
+
+ SequentialAnimation {
+ PropertyAnimation {
+ target: scrollHighlight
+ properties: "opacity"
+ easing.type: Easing.InOutQuad
+ from: 0
+ to: 1
+ duration: 500
+ }
+
+ PropertyAnimation {
+ target: scrollHighlight
+ properties: "opacity"
+ easing.type: Easing.InOutQuad
+ from: 1
+ to: 0
+ duration: 500
+ }
+
+ ScriptAction {
+ script: chat.model.eventShown()
+ }
+
+ }
+
+ }
+
+ }
}
Connections {
@@ -729,10 +723,12 @@ Item {
property string text
property string link
+ property string eventId
- function show(text_, link_) {
+ function show(text_, link_, eventId_) {
text = text_;
link = link_;
+ eventId = eventId_;
open();
}
@@ -754,7 +750,7 @@ Item {
visible: true
enabled: visible
text: qsTr("&Go to quoted message")
- onTriggered: chat.model.showEvent(eventId)
+ onTriggered: chat.model.showEvent(replyContextMenu.eventId)
}
}
diff --git a/resources/qml/TimelineRow.qml b/resources/qml/TimelineRow.qml
index 032821ba..43de679c 100644
--- a/resources/qml/TimelineRow.qml
+++ b/resources/qml/TimelineRow.qml
@@ -5,13 +5,13 @@
import "./delegates"
import "./emoji"
-import QtQuick 2.12
+import QtQuick 2.15
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.2
import QtQuick.Window 2.13
import im.nheko 1.0
-Item {
+AbstractButton {
id: r
required property double proportionalHeight
@@ -46,7 +46,7 @@ Item {
required property int status
required property int relatedEventCacheBuster
- property bool hovered: false
+ hoverEnabled: true
width: parent.width
height: row.height+(reactionRow.height > 0 ? reactionRow.height-2 : 0 )
@@ -55,21 +55,44 @@ Item {
color: (Settings.messageHoverHighlight && hovered) ? Nheko.colors.alternateBase : "transparent"
anchors.fill: parent
// this looks better without margins
+ TapHandler {
+ acceptedButtons: Qt.RightButton
+ onSingleTapped: messageContextMenu.show(eventId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText)
+ gesturePolicy: TapHandler.ReleaseWithinBounds
+ }
}
- TapHandler {
- acceptedButtons: Qt.RightButton
- onSingleTapped: messageContextMenu.show(eventId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText)
- gesturePolicy: TapHandler.ReleaseWithinBounds
+
+ onPressAndHold: messageContextMenu.show(eventId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText)
+ onDoubleClicked: chat.model.reply = eventId
+
+ DragHandler {
+ id: draghandler
+ yAxis.enabled: false
+ xAxis.maximum: 100
+ xAxis.minimum: -100
+ onActiveChanged: {
+ if(!active && (x < -70 || x > 70))
+ chat.model.reply = eventId
+ }
+ }
+ states: State {
+ name: "dragging"
+ when: draghandler.active
+ }
+ transitions: Transition {
+ from: "dragging"
+ to: ""
+ PropertyAnimation {
+ target: r
+ properties: "x"
+ easing.type: Easing.InOutQuad
+ to: 0
+ duration: 100
+ }
}
- TapHandler {
- onLongPressed: messageContextMenu.show(eventId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText)
- onDoubleTapped: chat.model.reply = eventId
- gesturePolicy: TapHandler.ReleaseWithinBounds
- }
-
- Control {
+ Rectangle {
id: row
property bool bubbleOnRight : isSender && Settings.bubbles
anchors.leftMargin: isStateEvent || Settings.smallAvatars? 0 : Nheko.avatarSize+8 // align bubble with section header
@@ -78,20 +101,21 @@ Item {
anchors.horizontalCenter: isStateEvent? parent.horizontalCenter : undefined
property int maxWidth: (parent.width-(Settings.smallAvatars || isStateEvent? 0 : Nheko.avatarSize+8))*(Settings.bubbles && !isStateEvent? 0.9 : 1)
width: Settings.bubbles? Math.min(maxWidth,Math.max(reply.implicitWidth+8,contentItem.implicitWidth+metadata.width+20)) : maxWidth
+ height: msg.height+msg.anchors.margins*2
- leftPadding: 4
- rightPadding: (Settings.bubbles && !isStateEvent)? 4: 2
- topPadding: rightPadding
- bottomPadding: topPadding
- background: Rectangle {
- property color userColor: TimelineManager.userColor(userId, Nheko.colors.base)
- property color bgColor: Nheko.colors.base
- color: Qt.tint(bgColor, Qt.hsla(userColor.hslHue, 0.5, userColor.hslLightness, 0.2))
- radius: 4
- visible: Settings.bubbles && !isStateEvent
- }
+ 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
- contentItem: GridLayout {
+ GridLayout {
+ anchors {
+ left: parent.left
+ top: parent.top
+ right: parent.right
+ margins: (Settings.bubbles && ! isStateEvent)? 4 : 2
+ leftMargin: 4
+ }
id: msg
rowSpacing: 0
columnSpacing: 2
diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index 59d09fc7..ceddfd68 100644
--- a/resources/qml/TimelineView.qml
+++ b/resources/qml/TimelineView.qml
@@ -32,6 +32,8 @@ Item {
if(!Qt.inputMethod.visible)
fullHeight = height
}
+
+ clip: true
Label {
visible: !room && !TimelineManager.isInitialSync && (!roomPreview || !roomPreview.roomid)
diff --git a/resources/qml/components/AdaptiveLayout.qml b/resources/qml/components/AdaptiveLayout.qml
index 28befe91..8e3c0e3d 100644
--- a/resources/qml/components/AdaptiveLayout.qml
+++ b/resources/qml/components/AdaptiveLayout.qml
@@ -131,6 +131,7 @@ Container {
interactive: singlePageMode
highlightMoveDuration: container.singlePageMode ? 200 : 0
currentIndex: container.singlePageMode ? container.pageIndex : 0
+ boundsBehavior: Flickable.StopAtBounds
}
}
diff --git a/resources/qml/delegates/ImageMessage.qml b/resources/qml/delegates/ImageMessage.qml
index 566302ab..64c5b356 100644
--- a/resources/qml/delegates/ImageMessage.qml
+++ b/resources/qml/delegates/ImageMessage.qml
@@ -5,9 +5,10 @@
import QtQuick 2.15
import QtQuick.Window 2.15
+import QtQuick.Controls 2.3
import im.nheko 1.0
-Item {
+AbstractButton {
required property int type
required property int originalWidth
required property double proportionalHeight
@@ -24,6 +25,7 @@ Item {
implicitWidth: Math.round(tempWidth*Math.min((timelineView.fullHeight/divisor)/(tempWidth*proportionalHeight), 1))
width: Math.min(parent.width,implicitWidth)
height: width*proportionalHeight
+ hoverEnabled: true
property int metadataWidth
property bool fitsMetadata: (parent.width - width) > metadataWidth+4
@@ -61,28 +63,17 @@ Item {
visible: loaded
anchors.fill: parent
roomm: room
- play: !Settings.animateImagesOnHover || mouseArea.hovered
+ play: !Settings.animateImagesOnHover || parent.hovered
eventId: parent.eventId
}
- TapHandler {
- //enabled: type == MtxEvent.ImageMessage && (img.status == Image.Ready || mxcimage.loaded)
- onSingleTapped: {
- Settings.openImageExternal ? room.openMedia(eventId) : TimelineManager.openImageOverlay(room, url, eventId);
- eventPoint.accepted = true;
- }
- gesturePolicy: TapHandler.ReleaseWithinBounds
- }
-
- HoverHandler {
- id: mouseArea
- }
+ onClicked :Settings.openImageExternal ? room.openMedia(eventId) : TimelineManager.openImageOverlay(room, url, eventId);
Item {
id: overlay
anchors.fill: parent
- visible: mouseArea.hovered
+ visible: parent.hovered
Rectangle {
id: container
diff --git a/resources/qml/delegates/Reply.qml b/resources/qml/delegates/Reply.qml
index 27fb4e07..53a007fe 100644
--- a/resources/qml/delegates/Reply.qml
+++ b/resources/qml/delegates/Reply.qml
@@ -11,7 +11,7 @@ import QtQuick.Window 2.13
import im.nheko 1.0
import "../"
-Item {
+AbstractButton {
id: r
property color userColor: "red"
@@ -57,6 +57,16 @@ Item {
color: TimelineManager.userColor(userId, Nheko.colors.base)
}
+ onClicked: {
+ let link = reply.child.linkAt != undefined && reply.child.linkAt(pressX-colorLine.width, pressY - userName_.implicitHeight);
+ if (link) {
+ Nheko.openLink(link)
+ } else {
+ room.showEvent(r.eventId)
+ }
+ }
+ onPressAndHold: replyContextMenu.show(reply.child.copyText, reply.child.linkAt(pressX-colorLine.width, pressY - userName_.implicitHeight), r.eventId)
+
ColumnLayout {
id: replyContainer
@@ -64,23 +74,9 @@ Item {
width: parent.width - 4
spacing: 0
- TapHandler {
- acceptedButtons: Qt.LeftButton
- onSingleTapped: {
- let link = reply.child.linkAt != undefined && reply.child.linkAt(eventPoint.position.x, eventPoint.position.y - userName_.implicitHeight);
- if (link) {
- Nheko.openLink(link)
- } else {
- room.showEvent(r.eventId)
- }
- }
- gesturePolicy: TapHandler.ReleaseWithinBounds
- }
-
TapHandler {
acceptedButtons: Qt.RightButton
- onLongPressed: replyContextMenu.show(reply.child.copyText, reply.child.linkAt(eventPoint.position.x, eventPoint.position.y - userName_.implicitHeight))
- onSingleTapped: replyContextMenu.show(reply.child.copyText, reply.child.linkAt(eventPoint.position.x, eventPoint.position.y - userName_.implicitHeight))
+ onSingleTapped: replyContextMenu.show(reply.child.copyText, reply.child.linkAt(eventPoint.position.x, eventPoint.position.y - userName_.implicitHeight), r.eventId)
gesturePolicy: TapHandler.ReleaseWithinBounds
}
diff --git a/src/Cache.cpp b/src/Cache.cpp
index be3dfe69..30077850 100644
--- a/src/Cache.cpp
+++ b/src/Cache.cpp
@@ -3708,8 +3708,10 @@ Cache::getImagePacks(const std::string &room_id, std::optional stickers)
auto addPack = [&infos, stickers](const mtx::events::msc2545::ImagePack &pack,
const std::string &source_room,
const std::string &state_key) {
- bool pack_matches = !stickers.has_value() ||
- (stickers.value() ? pack.pack->is_sticker() : pack.pack->is_emoji());
+ bool pack_is_sticker = pack.pack ? pack.pack->is_sticker() : true;
+ bool pack_is_emoji = pack.pack ? pack.pack->is_emoji() : true;
+ bool pack_matches =
+ !stickers.has_value() || (stickers.value() ? pack_is_sticker : pack_is_emoji);
ImagePackInfo info;
info.source_room = source_room;
diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp
index a82796a8..d5c2d428 100644
--- a/src/timeline/InputBar.cpp
+++ b/src/timeline/InputBar.cpp
@@ -896,39 +896,47 @@ MediaUpload::startUpload()
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
- thumbnail_.save(&buffer, "PNG");
- auto payload = std::string(ba.data(), ba.size());
- if (encrypt_) {
- mtx::crypto::BinaryBuf buf;
- std::tie(buf, thumbnailEncryptedFile) = mtx::crypto::encrypt_file(std::move(payload));
- payload = mtx::crypto::to_string(buf);
- }
- thumbnailSize_ = payload.size();
+ thumbnail_.save(&buffer, "PNG", 0);
+ if (ba.size() >= (data.size() - data.size() / 10)) {
+ nhlog::ui()->info(
+ "Thumbnail is not a lot smaller than original image, not uploading it");
+ nhlog::ui()->debug(
+ "\n Image size: {:9d}\nThumbnail size: {:9d}", data.size(), ba.size());
+ } else {
+ auto payload = std::string(ba.data(), ba.size());
+ if (encrypt_) {
+ mtx::crypto::BinaryBuf buf;
+ std::tie(buf, thumbnailEncryptedFile) =
+ mtx::crypto::encrypt_file(std::move(payload));
+ payload = mtx::crypto::to_string(buf);
+ }
+ thumbnailSize_ = payload.size();
+
+ http::client()->upload(
+ payload,
+ encryptedFile ? "application/octet-stream" : "image/png",
+ "",
+ [this](const mtx::responses::ContentURI &res, mtx::http::RequestErr err) mutable {
+ if (err) {
+ emit ChatPage::instance()->showNotification(
+ tr("Failed to upload media. Please try again."));
+ nhlog::net()->warn("failed to upload media: {} {} ({})",
+ err->matrix_error.error,
+ to_string(err->matrix_error.errcode),
+ static_cast(err->status_code));
+ thumbnail_ = QImage();
+ startUpload();
+ return;
+ }
+
+ thumbnailUrl_ = QString::fromStdString(res.content_uri);
+ if (thumbnailEncryptedFile)
+ thumbnailEncryptedFile->url = res.content_uri;
- http::client()->upload(
- payload,
- encryptedFile ? "application/octet-stream" : "image/png",
- "",
- [this](const mtx::responses::ContentURI &res, mtx::http::RequestErr err) mutable {
- if (err) {
- emit ChatPage::instance()->showNotification(
- tr("Failed to upload media. Please try again."));
- nhlog::net()->warn("failed to upload media: {} {} ({})",
- err->matrix_error.error,
- to_string(err->matrix_error.errcode),
- static_cast(err->status_code));
- thumbnail_ = QImage();
startUpload();
- return;
- }
-
- thumbnailUrl_ = QString::fromStdString(res.content_uri);
- if (thumbnailEncryptedFile)
- thumbnailEncryptedFile->url = res.content_uri;
-
- startUpload();
- });
- return;
+ });
+ return;
+ }
}
auto payload = std::string(data.data(), data.size());