summary refs log tree commit diff
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2020-01-17 01:25:14 +0100
committerNicolas Werner <nicolas.werner@hotmail.de>2020-01-17 01:25:14 +0100
commitfe912240bc1ab89b8a20ce87d5183f328f704d23 (patch)
treefd86e16977dc068c8ad404dc4ede4eb6640374de
parentRemove embedded fonts (diff)
downloadnheko-fe912240bc1ab89b8a20ce87d5183f328f704d23.tar.xz
Move typing display to qml
-rw-r--r--CMakeLists.txt2
-rw-r--r--resources/langs/nheko_de.ts67
-rw-r--r--resources/langs/nheko_el.ts67
-rw-r--r--resources/langs/nheko_en.ts67
-rw-r--r--resources/langs/nheko_fi.ts67
-rw-r--r--resources/langs/nheko_fr.ts67
-rw-r--r--resources/langs/nheko_nl.ts67
-rw-r--r--resources/langs/nheko_pl.ts69
-rw-r--r--resources/langs/nheko_ru.ts69
-rw-r--r--resources/langs/nheko_zh_CN.ts65
-rw-r--r--resources/qml/TimelineView.qml31
-rw-r--r--src/ChatPage.cpp53
-rw-r--r--src/ChatPage.h9
-rw-r--r--src/TypingDisplay.cpp86
-rw-r--r--src/TypingDisplay.h36
-rw-r--r--src/timeline/TimelineModel.cpp30
-rw-r--r--src/timeline/TimelineModel.h13
-rw-r--r--src/timeline/TimelineViewManager.cpp18
18 files changed, 377 insertions, 506 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt

index 7871bb6a..4ef6f378 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -242,7 +242,6 @@ set(SRC_FILES src/TextInputWidget.cpp src/TopRoomBar.cpp src/TrayIcon.cpp - src/TypingDisplay.cpp src/Utils.cpp src/UserInfoWidget.cpp src/UserSettingsPage.cpp @@ -379,7 +378,6 @@ qt5_wrap_cpp(MOC_HEADERS src/TextInputWidget.h src/TopRoomBar.h src/TrayIcon.h - src/TypingDisplay.h src/UserInfoWidget.h src/UserSettingsPage.h src/WelcomePage.h diff --git a/resources/langs/nheko_de.ts b/resources/langs/nheko_de.ts
index fbc2aa4f..a6d0e98d 100644 --- a/resources/langs/nheko_de.ts +++ b/resources/langs/nheko_de.ts
@@ -4,12 +4,12 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+346"/> + <location filename="../../src/ChatPage.cpp" line="+329"/> <source>Failed to upload media. Please try again.</source> <translation>Medienupload fehlgeschlagen. Bitte versuche es erneut.</translation> </message> <message> - <location line="+389"/> + <location line="+392"/> <source>Failed to restore OLM account. Please login again.</source> <translation>Wiederherstellung des OLM Accounts fehlgeschlagen. Bitte logge dich erneut ein.</translation> </message> @@ -19,7 +19,7 @@ <translation>Gespeicherte Nachrichten konnten nicht wiederhergestellt werden. Bitte melde Dich erneut an.</translation> </message> <message> - <location line="+181"/> + <location line="+148"/> <source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source> <translation>Fehler beim Setup der Verschlüsselungsschlüssel. Servermeldung: %1 %2. Bitte versuche es später erneut.</translation> </message> @@ -72,7 +72,7 @@ <context> <name>EditModal</name> <message> - <location filename="../../src/dialogs/RoomSettings.cpp" line="+58"/> + <location filename="../../src/dialogs/RoomSettings.cpp" line="+59"/> <source>Apply</source> <translation>Anwenden</translation> </message> @@ -182,7 +182,7 @@ <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+43"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+60"/> <source>redacted</source> <translation>gelöscht</translation> </message> @@ -223,7 +223,7 @@ <context> <name>QuickSwitcher</name> <message> - <location filename="../../src/QuickSwitcher.cpp" line="+71"/> + <location filename="../../src/QuickSwitcher.cpp" line="+72"/> <source>Search for a room...</source> <translation>Raum suchen…</translation> </message> @@ -279,7 +279,7 @@ <context> <name>ReplyPopup</name> <message> - <location filename="../../src/popups/ReplyPopup.cpp" line="+45"/> + <location filename="../../src/popups/ReplyPopup.cpp" line="+46"/> <source>Logout</source> <translation>Abmelden</translation> </message> @@ -287,7 +287,7 @@ <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+2307"/> + <location filename="../../src/Cache.cpp" line="+2303"/> <source>no version stored</source> <translation>keine Version gespeichert</translation> </message> @@ -300,12 +300,12 @@ <translation>Raum verlassen</translation> </message> <message> - <location line="+161"/> + <location line="+151"/> <source>Accept</source> <translation>Akzeptieren</translation> </message> <message> - <location line="+1"/> + <location line="+3"/> <source>Decline</source> <translation>Ablehnen</translation> </message> @@ -364,13 +364,13 @@ <context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+502"/> + <location filename="../../src/TextInputWidget.cpp" line="+496"/> <source>Send a file</source> <translation>Versende Datei</translation> </message> <message> <location line="+13"/> - <location filename="../../src/TextInputWidget.h" line="+161"/> + <location filename="../../src/TextInputWidget.h" line="+163"/> <source>Write a message...</source> <translation>Schreibe eine Nachricht…</translation> </message> @@ -385,7 +385,7 @@ <translation>Emoji</translation> </message> <message> - <location line="+72"/> + <location line="+73"/> <source>Select a file</source> <translation>Datei auswählen</translation> </message> @@ -403,7 +403,7 @@ <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+867"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+687"/> <source>-- Encrypted Event (No keys found for decryption) --</source> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment> <translation>-- verschlüsselter Event (keine Schlüssel zur Entschlüsselung gefunden) --</translation> @@ -427,18 +427,18 @@ <translation>-- Entschlüsselungsfehler (%1) --</translation> </message> <message> - <location line="+25"/> + <location line="+29"/> <source>-- Encrypted Event (Unknown event type) --</source> <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment> <translation>-- verschlüsselter Event (Unbekannter Eventtyp) --</translation> </message> <message> - <location line="+54"/> + <location line="+48"/> <source>Message redaction failed: %1</source> <translation>Nachricht zurückziehen fehlgeschlagen: %1</translation> </message> <message> - <location line="+453"/> + <location line="+454"/> <source>Save image</source> <translation>Bild speichern</translation> </message> @@ -457,11 +457,20 @@ <source>Save file</source> <translation>Datei speichern</translation> </message> + <message numerus="yes"> + <location line="+126"/> + <source>%1 and %2 are typing</source> + <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> + <translation type="unfinished"> + <numerusform>%1%2 tippt</numerusform> + <numerusform>%1 und %2 tippen</numerusform> + </translation> + </message> </context> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+57"/> + <location filename="../qml/TimelineRow.qml" line="+104"/> <source>Reply</source> <translation>Antworten</translation> </message> @@ -551,18 +560,6 @@ </message> </context> <context> - <name>TypingDisplay</name> - <message numerus="yes"> - <location filename="../../src/TypingDisplay.cpp" line="+37"/> - <source>%1 and %2 are typing</source> - <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> - <translation> - <numerusform>%1%2 tippt</numerusform> - <numerusform>%1 und %2 tippen</numerusform> - </translation> - </message> -</context> -<context> <name>UserInfoWidget</name> <message> <location filename="../../src/UserInfoWidget.cpp" line="+87"/> @@ -573,7 +570,7 @@ <context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+171"/> + <location filename="../../src/UserSettingsPage.cpp" line="+172"/> <source>Minimize to tray</source> <translation>Ins Benachrichtigungsfeld minimieren</translation> </message> @@ -740,7 +737,7 @@ <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+104"/> + <location filename="../../src/Utils.cpp" line="+106"/> <source>Yesterday</source> <translation>Gestern</translation> </message> @@ -1014,7 +1011,7 @@ Medien-Größe: %2 <translation>Aktivierung der Verschlüsselung fehlgeschlagen: %1</translation> </message> <message> - <location line="+148"/> + <location line="+146"/> <source>Select an avatar</source> <translation>Wähle einen Avatar</translation> </message> @@ -1114,7 +1111,7 @@ Medien-Größe: %2 <context> <name>message-description sent:</name> <message> - <location filename="../../src/Utils.h" line="+95"/> + <location filename="../../src/Utils.h" line="+100"/> <source>You sent an audio clip</source> <translation>Du hast eine Audiodatei gesendet.</translation> </message> @@ -1210,7 +1207,7 @@ Medien-Größe: %2 <context> <name>utils</name> <message> - <location filename="../../src/Utils.cpp" line="+282"/> + <location filename="../../src/Utils.cpp" line="+306"/> <source>sent a file.</source> <translation type="unfinished"></translation> </message> diff --git a/resources/langs/nheko_el.ts b/resources/langs/nheko_el.ts
index 1d9720ee..35fdeb80 100644 --- a/resources/langs/nheko_el.ts +++ b/resources/langs/nheko_el.ts
@@ -4,12 +4,12 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+346"/> + <location filename="../../src/ChatPage.cpp" line="+329"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+389"/> + <location line="+392"/> <source>Failed to restore OLM account. Please login again.</source> <translation type="unfinished"></translation> </message> @@ -19,7 +19,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+181"/> + <location line="+148"/> <source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source> <translation type="unfinished"></translation> </message> @@ -72,7 +72,7 @@ <context> <name>EditModal</name> <message> - <location filename="../../src/dialogs/RoomSettings.cpp" line="+58"/> + <location filename="../../src/dialogs/RoomSettings.cpp" line="+59"/> <source>Apply</source> <translation type="unfinished"></translation> </message> @@ -182,7 +182,7 @@ <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+43"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+60"/> <source>redacted</source> <translation type="unfinished"></translation> </message> @@ -223,7 +223,7 @@ <context> <name>QuickSwitcher</name> <message> - <location filename="../../src/QuickSwitcher.cpp" line="+71"/> + <location filename="../../src/QuickSwitcher.cpp" line="+72"/> <source>Search for a room...</source> <translation>Αναζήτηση συνομιλίας...</translation> </message> @@ -279,7 +279,7 @@ <context> <name>ReplyPopup</name> <message> - <location filename="../../src/popups/ReplyPopup.cpp" line="+45"/> + <location filename="../../src/popups/ReplyPopup.cpp" line="+46"/> <source>Logout</source> <translation type="unfinished"></translation> </message> @@ -287,7 +287,7 @@ <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+2307"/> + <location filename="../../src/Cache.cpp" line="+2303"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -300,12 +300,12 @@ <translation>Βγές</translation> </message> <message> - <location line="+161"/> + <location line="+151"/> <source>Accept</source> <translation>Αποδοχή</translation> </message> <message> - <location line="+1"/> + <location line="+3"/> <source>Decline</source> <translation>Απόρριψη</translation> </message> @@ -364,13 +364,13 @@ <context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+502"/> + <location filename="../../src/TextInputWidget.cpp" line="+496"/> <source>Send a file</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> - <location filename="../../src/TextInputWidget.h" line="+161"/> + <location filename="../../src/TextInputWidget.h" line="+163"/> <source>Write a message...</source> <translation>Γράψε ένα μήνυμα...</translation> </message> @@ -385,7 +385,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+72"/> + <location line="+73"/> <source>Select a file</source> <translation>Διάλεξε ένα αρχείο</translation> </message> @@ -403,7 +403,7 @@ <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+867"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+687"/> <source>-- Encrypted Event (No keys found for decryption) --</source> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment> <translation type="unfinished"></translation> @@ -427,18 +427,18 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+25"/> + <location line="+29"/> <source>-- Encrypted Event (Unknown event type) --</source> <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment> <translation type="unfinished"></translation> </message> <message> - <location line="+54"/> + <location line="+48"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="+453"/> + <location line="+454"/> <source>Save image</source> <translation type="unfinished">Αποθήκευση Εικόνας</translation> </message> @@ -457,11 +457,20 @@ <source>Save file</source> <translation type="unfinished"></translation> </message> + <message numerus="yes"> + <location line="+126"/> + <source>%1 and %2 are typing</source> + <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> </context> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+57"/> + <location filename="../qml/TimelineRow.qml" line="+104"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -551,18 +560,6 @@ </message> </context> <context> - <name>TypingDisplay</name> - <message numerus="yes"> - <location filename="../../src/TypingDisplay.cpp" line="+37"/> - <source>%1 and %2 are typing</source> - <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> - <translation type="unfinished"> - <numerusform></numerusform> - <numerusform></numerusform> - </translation> - </message> -</context> -<context> <name>UserInfoWidget</name> <message> <location filename="../../src/UserInfoWidget.cpp" line="+87"/> @@ -573,7 +570,7 @@ <context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+171"/> + <location filename="../../src/UserSettingsPage.cpp" line="+172"/> <source>Minimize to tray</source> <translation>Ελαχιστοποίηση</translation> </message> @@ -740,7 +737,7 @@ <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+104"/> + <location filename="../../src/Utils.cpp" line="+106"/> <source>Yesterday</source> <translation type="unfinished"></translation> </message> @@ -1012,7 +1009,7 @@ Media size: %2 <translation type="unfinished"></translation> </message> <message> - <location line="+148"/> + <location line="+146"/> <source>Select an avatar</source> <translation type="unfinished"></translation> </message> @@ -1112,7 +1109,7 @@ Media size: %2 <context> <name>message-description sent:</name> <message> - <location filename="../../src/Utils.h" line="+95"/> + <location filename="../../src/Utils.h" line="+100"/> <source>You sent an audio clip</source> <translation type="unfinished"></translation> </message> @@ -1208,7 +1205,7 @@ Media size: %2 <context> <name>utils</name> <message> - <location filename="../../src/Utils.cpp" line="+282"/> + <location filename="../../src/Utils.cpp" line="+306"/> <source>sent a file.</source> <translation type="unfinished"></translation> </message> diff --git a/resources/langs/nheko_en.ts b/resources/langs/nheko_en.ts
index fd8b4b25..40b6f09b 100644 --- a/resources/langs/nheko_en.ts +++ b/resources/langs/nheko_en.ts
@@ -4,12 +4,12 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+346"/> + <location filename="../../src/ChatPage.cpp" line="+329"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+389"/> + <location line="+392"/> <source>Failed to restore OLM account. Please login again.</source> <translation>Failed to restore OLM account. Please login again.</translation> </message> @@ -19,7 +19,7 @@ <translation>Failed to restore save data. Please login again.</translation> </message> <message> - <location line="+181"/> + <location line="+148"/> <source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source> <translation>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</translation> </message> @@ -72,7 +72,7 @@ <context> <name>EditModal</name> <message> - <location filename="../../src/dialogs/RoomSettings.cpp" line="+58"/> + <location filename="../../src/dialogs/RoomSettings.cpp" line="+59"/> <source>Apply</source> <translation>Apply</translation> </message> @@ -182,7 +182,7 @@ <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+43"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+60"/> <source>redacted</source> <translation type="unfinished"></translation> </message> @@ -223,7 +223,7 @@ <context> <name>QuickSwitcher</name> <message> - <location filename="../../src/QuickSwitcher.cpp" line="+71"/> + <location filename="../../src/QuickSwitcher.cpp" line="+72"/> <source>Search for a room...</source> <translation>Search for a room…</translation> </message> @@ -279,7 +279,7 @@ <context> <name>ReplyPopup</name> <message> - <location filename="../../src/popups/ReplyPopup.cpp" line="+45"/> + <location filename="../../src/popups/ReplyPopup.cpp" line="+46"/> <source>Logout</source> <translation>Logout</translation> </message> @@ -287,7 +287,7 @@ <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+2307"/> + <location filename="../../src/Cache.cpp" line="+2303"/> <source>no version stored</source> <translation>no version stored</translation> </message> @@ -300,12 +300,12 @@ <translation>Leave room</translation> </message> <message> - <location line="+161"/> + <location line="+151"/> <source>Accept</source> <translation>Accept</translation> </message> <message> - <location line="+1"/> + <location line="+3"/> <source>Decline</source> <translation>Decline</translation> </message> @@ -364,13 +364,13 @@ <context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+502"/> + <location filename="../../src/TextInputWidget.cpp" line="+496"/> <source>Send a file</source> <translation>Send a file</translation> </message> <message> <location line="+13"/> - <location filename="../../src/TextInputWidget.h" line="+161"/> + <location filename="../../src/TextInputWidget.h" line="+163"/> <source>Write a message...</source> <translation>Write a message…</translation> </message> @@ -385,7 +385,7 @@ <translation>Emoji</translation> </message> <message> - <location line="+72"/> + <location line="+73"/> <source>Select a file</source> <translation>Select a file</translation> </message> @@ -403,7 +403,7 @@ <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+867"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+687"/> <source>-- Encrypted Event (No keys found for decryption) --</source> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment> <translation type="unfinished">-- Encrypted Event (No keys found for decryption) --</translation> @@ -427,18 +427,18 @@ <translation type="unfinished">-- Decryption Error (%1) --</translation> </message> <message> - <location line="+25"/> + <location line="+29"/> <source>-- Encrypted Event (Unknown event type) --</source> <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment> <translation type="unfinished">-- Encrypted Event (Unknown event type) --</translation> </message> <message> - <location line="+54"/> + <location line="+48"/> <source>Message redaction failed: %1</source> <translation type="unfinished">Message redaction failed: %1</translation> </message> <message> - <location line="+453"/> + <location line="+454"/> <source>Save image</source> <translation type="unfinished">Save image</translation> </message> @@ -457,11 +457,20 @@ <source>Save file</source> <translation type="unfinished"></translation> </message> + <message numerus="yes"> + <location line="+126"/> + <source>%1 and %2 are typing</source> + <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> + <translation type="unfinished"> + <numerusform>%1%2 is typing</numerusform> + <numerusform>%1 and %2 are typing</numerusform> + </translation> + </message> </context> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+57"/> + <location filename="../qml/TimelineRow.qml" line="+104"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -551,18 +560,6 @@ </message> </context> <context> - <name>TypingDisplay</name> - <message numerus="yes"> - <location filename="../../src/TypingDisplay.cpp" line="+37"/> - <source>%1 and %2 are typing</source> - <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> - <translation> - <numerusform>%1%2 is typing</numerusform> - <numerusform>%1 and %2 are typing</numerusform> - </translation> - </message> -</context> -<context> <name>UserInfoWidget</name> <message> <location filename="../../src/UserInfoWidget.cpp" line="+87"/> @@ -573,7 +570,7 @@ <context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+171"/> + <location filename="../../src/UserSettingsPage.cpp" line="+172"/> <source>Minimize to tray</source> <translation>Minimize to tray</translation> </message> @@ -740,7 +737,7 @@ <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+104"/> + <location filename="../../src/Utils.cpp" line="+106"/> <source>Yesterday</source> <translation>Yesterday</translation> </message> @@ -1016,7 +1013,7 @@ Media size: %2 <translation>Failed to enable encryption: %1</translation> </message> <message> - <location line="+148"/> + <location line="+146"/> <source>Select an avatar</source> <translation>Select an avatar</translation> </message> @@ -1116,7 +1113,7 @@ Media size: %2 <context> <name>message-description sent:</name> <message> - <location filename="../../src/Utils.h" line="+95"/> + <location filename="../../src/Utils.h" line="+100"/> <source>You sent an audio clip</source> <translation type="unfinished"></translation> </message> @@ -1212,7 +1209,7 @@ Media size: %2 <context> <name>utils</name> <message> - <location filename="../../src/Utils.cpp" line="+282"/> + <location filename="../../src/Utils.cpp" line="+306"/> <source>sent a file.</source> <translation>sent a file.</translation> </message> diff --git a/resources/langs/nheko_fi.ts b/resources/langs/nheko_fi.ts
index d851b879..cae5a109 100644 --- a/resources/langs/nheko_fi.ts +++ b/resources/langs/nheko_fi.ts
@@ -4,12 +4,12 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+346"/> + <location filename="../../src/ChatPage.cpp" line="+329"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+389"/> + <location line="+392"/> <source>Failed to restore OLM account. Please login again.</source> <translation>OLM-tilin palauttaminen epäonnistui. Ole hyvä ja kirjaudu sisään uudelleen.</translation> </message> @@ -19,7 +19,7 @@ <translation>Tallennettujen tietojen palauttaminen epäonnistui. Ole hyvä ja kirjaudu sisään uudelleen.</translation> </message> <message> - <location line="+181"/> + <location line="+148"/> <source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source> <translation>Salausavainten lähetys epäonnistui. Palvelimen vastaus: %1 %2. Ole hyvä ja yritä uudelleen myöhemmin.</translation> </message> @@ -72,7 +72,7 @@ <context> <name>EditModal</name> <message> - <location filename="../../src/dialogs/RoomSettings.cpp" line="+58"/> + <location filename="../../src/dialogs/RoomSettings.cpp" line="+59"/> <source>Apply</source> <translation>Tallenna</translation> </message> @@ -182,7 +182,7 @@ <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+43"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+60"/> <source>redacted</source> <translation type="unfinished"></translation> </message> @@ -223,7 +223,7 @@ <context> <name>QuickSwitcher</name> <message> - <location filename="../../src/QuickSwitcher.cpp" line="+71"/> + <location filename="../../src/QuickSwitcher.cpp" line="+72"/> <source>Search for a room...</source> <translation>Etsi huonetta…</translation> </message> @@ -279,7 +279,7 @@ <context> <name>ReplyPopup</name> <message> - <location filename="../../src/popups/ReplyPopup.cpp" line="+45"/> + <location filename="../../src/popups/ReplyPopup.cpp" line="+46"/> <source>Logout</source> <translation>Kirjaudu ulos</translation> </message> @@ -287,7 +287,7 @@ <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+2307"/> + <location filename="../../src/Cache.cpp" line="+2303"/> <source>no version stored</source> <translation>ei tallennettua versiota</translation> </message> @@ -300,12 +300,12 @@ <translation>Poistu huoneesta</translation> </message> <message> - <location line="+161"/> + <location line="+151"/> <source>Accept</source> <translation>Hyväksy</translation> </message> <message> - <location line="+1"/> + <location line="+3"/> <source>Decline</source> <translation>Hylkää</translation> </message> @@ -364,13 +364,13 @@ <context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+502"/> + <location filename="../../src/TextInputWidget.cpp" line="+496"/> <source>Send a file</source> <translation>Lähetä tiedosto</translation> </message> <message> <location line="+13"/> - <location filename="../../src/TextInputWidget.h" line="+161"/> + <location filename="../../src/TextInputWidget.h" line="+163"/> <source>Write a message...</source> <translation>Kirjoita viesti…</translation> </message> @@ -385,7 +385,7 @@ <translation>Emoji</translation> </message> <message> - <location line="+72"/> + <location line="+73"/> <source>Select a file</source> <translation>Valitse tiedosto</translation> </message> @@ -403,7 +403,7 @@ <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+867"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+687"/> <source>-- Encrypted Event (No keys found for decryption) --</source> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment> <translation type="unfinished">-- Salattu viesti (salauksen purkuavaimia ei löydetty) --</translation> @@ -427,18 +427,18 @@ <translation type="unfinished">-- Virhe purkaessa salausta (%1) --</translation> </message> <message> - <location line="+25"/> + <location line="+29"/> <source>-- Encrypted Event (Unknown event type) --</source> <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment> <translation type="unfinished">-- Salattu viesti (tuntematon viestityyppi) --</translation> </message> <message> - <location line="+54"/> + <location line="+48"/> <source>Message redaction failed: %1</source> <translation type="unfinished">Viestin poisto epäonnistui: %1</translation> </message> <message> - <location line="+453"/> + <location line="+454"/> <source>Save image</source> <translation type="unfinished">Tallenna kuva</translation> </message> @@ -457,11 +457,20 @@ <source>Save file</source> <translation type="unfinished"></translation> </message> + <message numerus="yes"> + <location line="+126"/> + <source>%1 and %2 are typing</source> + <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> + <translation type="unfinished"> + <numerusform>%1%2 kirjoittaa</numerusform> + <numerusform>%1 ja %2 kirjoittavat</numerusform> + </translation> + </message> </context> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+57"/> + <location filename="../qml/TimelineRow.qml" line="+104"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -551,18 +560,6 @@ </message> </context> <context> - <name>TypingDisplay</name> - <message numerus="yes"> - <location filename="../../src/TypingDisplay.cpp" line="+37"/> - <source>%1 and %2 are typing</source> - <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> - <translation> - <numerusform>%1%2 kirjoittaa</numerusform> - <numerusform>%1 ja %2 kirjoittavat</numerusform> - </translation> - </message> -</context> -<context> <name>UserInfoWidget</name> <message> <location filename="../../src/UserInfoWidget.cpp" line="+87"/> @@ -573,7 +570,7 @@ <context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+171"/> + <location filename="../../src/UserSettingsPage.cpp" line="+172"/> <source>Minimize to tray</source> <translation>Pienennä ilmoitusalueelle</translation> </message> @@ -740,7 +737,7 @@ <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+104"/> + <location filename="../../src/Utils.cpp" line="+106"/> <source>Yesterday</source> <translation>Eilen</translation> </message> @@ -1016,7 +1013,7 @@ Median koko: %2 <translation>Salauksen aktivointi epäonnistui: %1</translation> </message> <message> - <location line="+148"/> + <location line="+146"/> <source>Select an avatar</source> <translation>Valitse profiilikuva</translation> </message> @@ -1116,7 +1113,7 @@ Median koko: %2 <context> <name>message-description sent:</name> <message> - <location filename="../../src/Utils.h" line="+95"/> + <location filename="../../src/Utils.h" line="+100"/> <source>You sent an audio clip</source> <translation type="unfinished"></translation> </message> @@ -1212,7 +1209,7 @@ Median koko: %2 <context> <name>utils</name> <message> - <location filename="../../src/Utils.cpp" line="+282"/> + <location filename="../../src/Utils.cpp" line="+306"/> <source>sent a file.</source> <translation type="unfinished"></translation> </message> diff --git a/resources/langs/nheko_fr.ts b/resources/langs/nheko_fr.ts
index 15494953..3646d061 100644 --- a/resources/langs/nheko_fr.ts +++ b/resources/langs/nheko_fr.ts
@@ -4,12 +4,12 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+346"/> + <location filename="../../src/ChatPage.cpp" line="+329"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+389"/> + <location line="+392"/> <source>Failed to restore OLM account. Please login again.</source> <translation type="unfinished"></translation> </message> @@ -19,7 +19,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+181"/> + <location line="+148"/> <source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source> <translation type="unfinished"></translation> </message> @@ -72,7 +72,7 @@ <context> <name>EditModal</name> <message> - <location filename="../../src/dialogs/RoomSettings.cpp" line="+58"/> + <location filename="../../src/dialogs/RoomSettings.cpp" line="+59"/> <source>Apply</source> <translation type="unfinished"></translation> </message> @@ -182,7 +182,7 @@ <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+43"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+60"/> <source>redacted</source> <translation type="unfinished"></translation> </message> @@ -223,7 +223,7 @@ <context> <name>QuickSwitcher</name> <message> - <location filename="../../src/QuickSwitcher.cpp" line="+71"/> + <location filename="../../src/QuickSwitcher.cpp" line="+72"/> <source>Search for a room...</source> <translation>Chercher un salon…</translation> </message> @@ -280,7 +280,7 @@ <context> <name>ReplyPopup</name> <message> - <location filename="../../src/popups/ReplyPopup.cpp" line="+45"/> + <location filename="../../src/popups/ReplyPopup.cpp" line="+46"/> <source>Logout</source> <translation type="unfinished"></translation> </message> @@ -288,7 +288,7 @@ <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+2307"/> + <location filename="../../src/Cache.cpp" line="+2303"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -301,12 +301,12 @@ <translation>Quitter le salon</translation> </message> <message> - <location line="+161"/> + <location line="+151"/> <source>Accept</source> <translation>Accepter</translation> </message> <message> - <location line="+1"/> + <location line="+3"/> <source>Decline</source> <translation>Décliner</translation> </message> @@ -365,13 +365,13 @@ <context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+502"/> + <location filename="../../src/TextInputWidget.cpp" line="+496"/> <source>Send a file</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> - <location filename="../../src/TextInputWidget.h" line="+161"/> + <location filename="../../src/TextInputWidget.h" line="+163"/> <source>Write a message...</source> <translation>Écrivez un message...</translation> </message> @@ -386,7 +386,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+72"/> + <location line="+73"/> <source>Select a file</source> <translation>Sélectionnez un fichier</translation> </message> @@ -404,7 +404,7 @@ <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+867"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+687"/> <source>-- Encrypted Event (No keys found for decryption) --</source> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment> <translation type="unfinished"></translation> @@ -428,18 +428,18 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+25"/> + <location line="+29"/> <source>-- Encrypted Event (Unknown event type) --</source> <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment> <translation type="unfinished"></translation> </message> <message> - <location line="+54"/> + <location line="+48"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="+453"/> + <location line="+454"/> <source>Save image</source> <translation type="unfinished">Enregistrer l&apos;image</translation> </message> @@ -458,11 +458,20 @@ <source>Save file</source> <translation type="unfinished"></translation> </message> + <message numerus="yes"> + <location line="+126"/> + <source>%1 and %2 are typing</source> + <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> </context> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+57"/> + <location filename="../qml/TimelineRow.qml" line="+104"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -552,18 +561,6 @@ </message> </context> <context> - <name>TypingDisplay</name> - <message numerus="yes"> - <location filename="../../src/TypingDisplay.cpp" line="+37"/> - <source>%1 and %2 are typing</source> - <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> - <translation type="unfinished"> - <numerusform></numerusform> - <numerusform></numerusform> - </translation> - </message> -</context> -<context> <name>UserInfoWidget</name> <message> <location filename="../../src/UserInfoWidget.cpp" line="+87"/> @@ -574,7 +571,7 @@ <context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+171"/> + <location filename="../../src/UserSettingsPage.cpp" line="+172"/> <source>Minimize to tray</source> <translation>Réduire à la barre des tâches</translation> </message> @@ -741,7 +738,7 @@ <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+104"/> + <location filename="../../src/Utils.cpp" line="+106"/> <source>Yesterday</source> <translation type="unfinished"></translation> </message> @@ -1015,7 +1012,7 @@ Taille du média : %2 <translation type="unfinished"></translation> </message> <message> - <location line="+148"/> + <location line="+146"/> <source>Select an avatar</source> <translation type="unfinished"></translation> </message> @@ -1115,7 +1112,7 @@ Taille du média : %2 <context> <name>message-description sent:</name> <message> - <location filename="../../src/Utils.h" line="+95"/> + <location filename="../../src/Utils.h" line="+100"/> <source>You sent an audio clip</source> <translation type="unfinished"></translation> </message> @@ -1211,7 +1208,7 @@ Taille du média : %2 <context> <name>utils</name> <message> - <location filename="../../src/Utils.cpp" line="+282"/> + <location filename="../../src/Utils.cpp" line="+306"/> <source>sent a file.</source> <translation type="unfinished"></translation> </message> diff --git a/resources/langs/nheko_nl.ts b/resources/langs/nheko_nl.ts
index 8ff6d5d8..960feb6e 100644 --- a/resources/langs/nheko_nl.ts +++ b/resources/langs/nheko_nl.ts
@@ -4,12 +4,12 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+346"/> + <location filename="../../src/ChatPage.cpp" line="+329"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+389"/> + <location line="+392"/> <source>Failed to restore OLM account. Please login again.</source> <translation type="unfinished"></translation> </message> @@ -19,7 +19,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+181"/> + <location line="+148"/> <source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source> <translation type="unfinished"></translation> </message> @@ -72,7 +72,7 @@ <context> <name>EditModal</name> <message> - <location filename="../../src/dialogs/RoomSettings.cpp" line="+58"/> + <location filename="../../src/dialogs/RoomSettings.cpp" line="+59"/> <source>Apply</source> <translation type="unfinished"></translation> </message> @@ -182,7 +182,7 @@ <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+43"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+60"/> <source>redacted</source> <translation type="unfinished"></translation> </message> @@ -223,7 +223,7 @@ <context> <name>QuickSwitcher</name> <message> - <location filename="../../src/QuickSwitcher.cpp" line="+71"/> + <location filename="../../src/QuickSwitcher.cpp" line="+72"/> <source>Search for a room...</source> <translation>Zoek een kamer...</translation> </message> @@ -279,7 +279,7 @@ <context> <name>ReplyPopup</name> <message> - <location filename="../../src/popups/ReplyPopup.cpp" line="+45"/> + <location filename="../../src/popups/ReplyPopup.cpp" line="+46"/> <source>Logout</source> <translation type="unfinished"></translation> </message> @@ -287,7 +287,7 @@ <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+2307"/> + <location filename="../../src/Cache.cpp" line="+2303"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -300,12 +300,12 @@ <translation>Kamer verlaten</translation> </message> <message> - <location line="+161"/> + <location line="+151"/> <source>Accept</source> <translation>Accepteren</translation> </message> <message> - <location line="+1"/> + <location line="+3"/> <source>Decline</source> <translation>Afwijzen</translation> </message> @@ -364,13 +364,13 @@ <context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+502"/> + <location filename="../../src/TextInputWidget.cpp" line="+496"/> <source>Send a file</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> - <location filename="../../src/TextInputWidget.h" line="+161"/> + <location filename="../../src/TextInputWidget.h" line="+163"/> <source>Write a message...</source> <translation>Typ een bericht...</translation> </message> @@ -385,7 +385,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+72"/> + <location line="+73"/> <source>Select a file</source> <translation>Kies een bestand</translation> </message> @@ -403,7 +403,7 @@ <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+867"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+687"/> <source>-- Encrypted Event (No keys found for decryption) --</source> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment> <translation type="unfinished"></translation> @@ -427,18 +427,18 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+25"/> + <location line="+29"/> <source>-- Encrypted Event (Unknown event type) --</source> <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment> <translation type="unfinished"></translation> </message> <message> - <location line="+54"/> + <location line="+48"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="+453"/> + <location line="+454"/> <source>Save image</source> <translation type="unfinished">Afbeelding opslaan</translation> </message> @@ -457,11 +457,20 @@ <source>Save file</source> <translation type="unfinished"></translation> </message> + <message numerus="yes"> + <location line="+126"/> + <source>%1 and %2 are typing</source> + <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> </context> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+57"/> + <location filename="../qml/TimelineRow.qml" line="+104"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -551,18 +560,6 @@ </message> </context> <context> - <name>TypingDisplay</name> - <message numerus="yes"> - <location filename="../../src/TypingDisplay.cpp" line="+37"/> - <source>%1 and %2 are typing</source> - <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> - <translation type="unfinished"> - <numerusform></numerusform> - <numerusform></numerusform> - </translation> - </message> -</context> -<context> <name>UserInfoWidget</name> <message> <location filename="../../src/UserInfoWidget.cpp" line="+87"/> @@ -573,7 +570,7 @@ <context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+171"/> + <location filename="../../src/UserSettingsPage.cpp" line="+172"/> <source>Minimize to tray</source> <translation>Minimaliseren naar systeemvak</translation> </message> @@ -740,7 +737,7 @@ <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+104"/> + <location filename="../../src/Utils.cpp" line="+106"/> <source>Yesterday</source> <translation type="unfinished"></translation> </message> @@ -1014,7 +1011,7 @@ Mediagrootte: %2 <translation type="unfinished"></translation> </message> <message> - <location line="+148"/> + <location line="+146"/> <source>Select an avatar</source> <translation type="unfinished"></translation> </message> @@ -1114,7 +1111,7 @@ Mediagrootte: %2 <context> <name>message-description sent:</name> <message> - <location filename="../../src/Utils.h" line="+95"/> + <location filename="../../src/Utils.h" line="+100"/> <source>You sent an audio clip</source> <translation type="unfinished"></translation> </message> @@ -1210,7 +1207,7 @@ Mediagrootte: %2 <context> <name>utils</name> <message> - <location filename="../../src/Utils.cpp" line="+282"/> + <location filename="../../src/Utils.cpp" line="+306"/> <source>sent a file.</source> <translation type="unfinished"></translation> </message> diff --git a/resources/langs/nheko_pl.ts b/resources/langs/nheko_pl.ts
index cb628fa6..a94ab30e 100644 --- a/resources/langs/nheko_pl.ts +++ b/resources/langs/nheko_pl.ts
@@ -4,12 +4,12 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+346"/> + <location filename="../../src/ChatPage.cpp" line="+329"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+389"/> + <location line="+392"/> <source>Failed to restore OLM account. Please login again.</source> <translation>Nie udało się przywrócić konta OLM. Spróbuj zalogować się ponownie.</translation> </message> @@ -19,7 +19,7 @@ <translation>Nie udało się przywrócić zapisanych danych. Spróbuj zalogować się ponownie.</translation> </message> <message> - <location line="+181"/> + <location line="+148"/> <source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source> <translation type="unfinished"></translation> </message> @@ -72,7 +72,7 @@ <context> <name>EditModal</name> <message> - <location filename="../../src/dialogs/RoomSettings.cpp" line="+58"/> + <location filename="../../src/dialogs/RoomSettings.cpp" line="+59"/> <source>Apply</source> <translation type="unfinished"></translation> </message> @@ -182,7 +182,7 @@ <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+43"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+60"/> <source>redacted</source> <translation type="unfinished"></translation> </message> @@ -223,7 +223,7 @@ <context> <name>QuickSwitcher</name> <message> - <location filename="../../src/QuickSwitcher.cpp" line="+71"/> + <location filename="../../src/QuickSwitcher.cpp" line="+72"/> <source>Search for a room...</source> <translation>Wyszukaj pokoju…</translation> </message> @@ -279,7 +279,7 @@ <context> <name>ReplyPopup</name> <message> - <location filename="../../src/popups/ReplyPopup.cpp" line="+45"/> + <location filename="../../src/popups/ReplyPopup.cpp" line="+46"/> <source>Logout</source> <translation type="unfinished">Wyloguj</translation> </message> @@ -287,7 +287,7 @@ <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+2307"/> + <location filename="../../src/Cache.cpp" line="+2303"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -300,12 +300,12 @@ <translation>Opuść pokój</translation> </message> <message> - <location line="+161"/> + <location line="+151"/> <source>Accept</source> <translation>Akceptuj</translation> </message> <message> - <location line="+1"/> + <location line="+3"/> <source>Decline</source> <translation>Odrzuć</translation> </message> @@ -364,13 +364,13 @@ <context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+502"/> + <location filename="../../src/TextInputWidget.cpp" line="+496"/> <source>Send a file</source> <translation>Wyślij plik</translation> </message> <message> <location line="+13"/> - <location filename="../../src/TextInputWidget.h" line="+161"/> + <location filename="../../src/TextInputWidget.h" line="+163"/> <source>Write a message...</source> <translation>Napisz wiadomość…</translation> </message> @@ -385,7 +385,7 @@ <translation>Emoji</translation> </message> <message> - <location line="+72"/> + <location line="+73"/> <source>Select a file</source> <translation>Wybierz plik</translation> </message> @@ -403,7 +403,7 @@ <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+867"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+687"/> <source>-- Encrypted Event (No keys found for decryption) --</source> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment> <translation type="unfinished"></translation> @@ -427,18 +427,18 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+25"/> + <location line="+29"/> <source>-- Encrypted Event (Unknown event type) --</source> <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment> <translation type="unfinished"></translation> </message> <message> - <location line="+54"/> + <location line="+48"/> <source>Message redaction failed: %1</source> <translation type="unfinished">Redagowanie wiadomości nie powiodło się: %1</translation> </message> <message> - <location line="+453"/> + <location line="+454"/> <source>Save image</source> <translation type="unfinished">Zapisz obraz</translation> </message> @@ -457,11 +457,21 @@ <source>Save file</source> <translation type="unfinished"></translation> </message> + <message numerus="yes"> + <location line="+126"/> + <source>%1 and %2 are typing</source> + <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> </context> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+57"/> + <location filename="../qml/TimelineRow.qml" line="+104"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -551,19 +561,6 @@ </message> </context> <context> - <name>TypingDisplay</name> - <message numerus="yes"> - <location filename="../../src/TypingDisplay.cpp" line="+37"/> - <source>%1 and %2 are typing</source> - <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> - <translation type="unfinished"> - <numerusform></numerusform> - <numerusform></numerusform> - <numerusform></numerusform> - </translation> - </message> -</context> -<context> <name>UserInfoWidget</name> <message> <location filename="../../src/UserInfoWidget.cpp" line="+87"/> @@ -574,7 +571,7 @@ <context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+171"/> + <location filename="../../src/UserSettingsPage.cpp" line="+172"/> <source>Minimize to tray</source> <translation>Zminimalizuj do paska zadań</translation> </message> @@ -741,7 +738,7 @@ <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+104"/> + <location filename="../../src/Utils.cpp" line="+106"/> <source>Yesterday</source> <translation type="unfinished"></translation> </message> @@ -1018,7 +1015,7 @@ Rozmiar multimediów: %2 <translation>Nie udało się włączyć szyfrowania: %1</translation> </message> <message> - <location line="+148"/> + <location line="+146"/> <source>Select an avatar</source> <translation>Wybierz awatar</translation> </message> @@ -1118,7 +1115,7 @@ Rozmiar multimediów: %2 <context> <name>message-description sent:</name> <message> - <location filename="../../src/Utils.h" line="+95"/> + <location filename="../../src/Utils.h" line="+100"/> <source>You sent an audio clip</source> <translation type="unfinished"></translation> </message> @@ -1214,7 +1211,7 @@ Rozmiar multimediów: %2 <context> <name>utils</name> <message> - <location filename="../../src/Utils.cpp" line="+282"/> + <location filename="../../src/Utils.cpp" line="+306"/> <source>sent a file.</source> <translation type="unfinished"></translation> </message> diff --git a/resources/langs/nheko_ru.ts b/resources/langs/nheko_ru.ts
index 12b9873e..e8c7a4e8 100644 --- a/resources/langs/nheko_ru.ts +++ b/resources/langs/nheko_ru.ts
@@ -4,12 +4,12 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+346"/> + <location filename="../../src/ChatPage.cpp" line="+329"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+389"/> + <location line="+392"/> <source>Failed to restore OLM account. Please login again.</source> <translation>Не удалось восстановить учетную запись OLM. Пожалуйста, войдите снова.</translation> </message> @@ -19,7 +19,7 @@ <translation>Не удалось восстановить сохраненные данные. Пожалуйста, войдите снова.</translation> </message> <message> - <location line="+181"/> + <location line="+148"/> <source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source> <translation>Не удалось настроить ключи шифрования. Ответ сервера:%1 %2. Пожалуйста, попробуйте позже.</translation> </message> @@ -72,7 +72,7 @@ <context> <name>EditModal</name> <message> - <location filename="../../src/dialogs/RoomSettings.cpp" line="+58"/> + <location filename="../../src/dialogs/RoomSettings.cpp" line="+59"/> <source>Apply</source> <translation>Применить</translation> </message> @@ -182,7 +182,7 @@ <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+43"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+60"/> <source>redacted</source> <translation type="unfinished"></translation> </message> @@ -223,7 +223,7 @@ <context> <name>QuickSwitcher</name> <message> - <location filename="../../src/QuickSwitcher.cpp" line="+71"/> + <location filename="../../src/QuickSwitcher.cpp" line="+72"/> <source>Search for a room...</source> <translation>Поиск комнаты...</translation> </message> @@ -279,7 +279,7 @@ <context> <name>ReplyPopup</name> <message> - <location filename="../../src/popups/ReplyPopup.cpp" line="+45"/> + <location filename="../../src/popups/ReplyPopup.cpp" line="+46"/> <source>Logout</source> <translation type="unfinished">Выйти</translation> </message> @@ -287,7 +287,7 @@ <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+2307"/> + <location filename="../../src/Cache.cpp" line="+2303"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -300,12 +300,12 @@ <translation>Покинуть комнату</translation> </message> <message> - <location line="+161"/> + <location line="+151"/> <source>Accept</source> <translation>Принять</translation> </message> <message> - <location line="+1"/> + <location line="+3"/> <source>Decline</source> <translation>Отказаться</translation> </message> @@ -364,13 +364,13 @@ <context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+502"/> + <location filename="../../src/TextInputWidget.cpp" line="+496"/> <source>Send a file</source> <translation>Отправить файл</translation> </message> <message> <location line="+13"/> - <location filename="../../src/TextInputWidget.h" line="+161"/> + <location filename="../../src/TextInputWidget.h" line="+163"/> <source>Write a message...</source> <translation>Написать сообщение...</translation> </message> @@ -385,7 +385,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+72"/> + <location line="+73"/> <source>Select a file</source> <translation>Выберите файл</translation> </message> @@ -403,7 +403,7 @@ <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+867"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+687"/> <source>-- Encrypted Event (No keys found for decryption) --</source> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment> <translation type="unfinished"></translation> @@ -427,18 +427,18 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+25"/> + <location line="+29"/> <source>-- Encrypted Event (Unknown event type) --</source> <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment> <translation type="unfinished"></translation> </message> <message> - <location line="+54"/> + <location line="+48"/> <source>Message redaction failed: %1</source> <translation type="unfinished">Ошибка редактирования сообщения: %1</translation> </message> <message> - <location line="+453"/> + <location line="+454"/> <source>Save image</source> <translation type="unfinished">Сохранить изображение</translation> </message> @@ -457,11 +457,21 @@ <source>Save file</source> <translation type="unfinished"></translation> </message> + <message numerus="yes"> + <location line="+126"/> + <source>%1 and %2 are typing</source> + <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> </context> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+57"/> + <location filename="../qml/TimelineRow.qml" line="+104"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -551,19 +561,6 @@ </message> </context> <context> - <name>TypingDisplay</name> - <message numerus="yes"> - <location filename="../../src/TypingDisplay.cpp" line="+37"/> - <source>%1 and %2 are typing</source> - <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> - <translation type="unfinished"> - <numerusform></numerusform> - <numerusform></numerusform> - <numerusform></numerusform> - </translation> - </message> -</context> -<context> <name>UserInfoWidget</name> <message> <location filename="../../src/UserInfoWidget.cpp" line="+87"/> @@ -574,7 +571,7 @@ <context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+171"/> + <location filename="../../src/UserSettingsPage.cpp" line="+172"/> <source>Minimize to tray</source> <translation>Сворачивать в системную панель</translation> </message> @@ -742,7 +739,7 @@ <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+104"/> + <location filename="../../src/Utils.cpp" line="+106"/> <source>Yesterday</source> <translation type="unfinished"></translation> </message> @@ -1017,7 +1014,7 @@ Media size: %2 <translation>Не удалось включить шифрование: %1</translation> </message> <message> - <location line="+148"/> + <location line="+146"/> <source>Select an avatar</source> <translation>Выберите аватар</translation> </message> @@ -1117,7 +1114,7 @@ Media size: %2 <context> <name>message-description sent:</name> <message> - <location filename="../../src/Utils.h" line="+95"/> + <location filename="../../src/Utils.h" line="+100"/> <source>You sent an audio clip</source> <translation type="unfinished"></translation> </message> @@ -1213,7 +1210,7 @@ Media size: %2 <context> <name>utils</name> <message> - <location filename="../../src/Utils.cpp" line="+282"/> + <location filename="../../src/Utils.cpp" line="+306"/> <source>sent a file.</source> <translation type="unfinished"></translation> </message> diff --git a/resources/langs/nheko_zh_CN.ts b/resources/langs/nheko_zh_CN.ts
index 799a534d..718bcb55 100644 --- a/resources/langs/nheko_zh_CN.ts +++ b/resources/langs/nheko_zh_CN.ts
@@ -4,12 +4,12 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+346"/> + <location filename="../../src/ChatPage.cpp" line="+329"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+389"/> + <location line="+392"/> <source>Failed to restore OLM account. Please login again.</source> <translation>恢复 OLM 账户失败。请重新登录。</translation> </message> @@ -19,7 +19,7 @@ <translation>恢复保存的数据失败。请重新登录。</translation> </message> <message> - <location line="+181"/> + <location line="+148"/> <source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source> <translation type="unfinished"></translation> </message> @@ -72,7 +72,7 @@ <context> <name>EditModal</name> <message> - <location filename="../../src/dialogs/RoomSettings.cpp" line="+58"/> + <location filename="../../src/dialogs/RoomSettings.cpp" line="+59"/> <source>Apply</source> <translation type="unfinished"></translation> </message> @@ -182,7 +182,7 @@ <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+43"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+60"/> <source>redacted</source> <translation type="unfinished"></translation> </message> @@ -223,7 +223,7 @@ <context> <name>QuickSwitcher</name> <message> - <location filename="../../src/QuickSwitcher.cpp" line="+71"/> + <location filename="../../src/QuickSwitcher.cpp" line="+72"/> <source>Search for a room...</source> <translation>寻找一个聊天室...</translation> </message> @@ -279,7 +279,7 @@ <context> <name>ReplyPopup</name> <message> - <location filename="../../src/popups/ReplyPopup.cpp" line="+45"/> + <location filename="../../src/popups/ReplyPopup.cpp" line="+46"/> <source>Logout</source> <translation type="unfinished">登出</translation> </message> @@ -287,7 +287,7 @@ <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+2307"/> + <location filename="../../src/Cache.cpp" line="+2303"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -300,12 +300,12 @@ <translation>离开聊天室</translation> </message> <message> - <location line="+161"/> + <location line="+151"/> <source>Accept</source> <translation>接受</translation> </message> <message> - <location line="+1"/> + <location line="+3"/> <source>Decline</source> <translation>拒绝</translation> </message> @@ -364,13 +364,13 @@ <context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+502"/> + <location filename="../../src/TextInputWidget.cpp" line="+496"/> <source>Send a file</source> <translation>发送一个文件</translation> </message> <message> <location line="+13"/> - <location filename="../../src/TextInputWidget.h" line="+161"/> + <location filename="../../src/TextInputWidget.h" line="+163"/> <source>Write a message...</source> <translation>写一条消息...</translation> </message> @@ -385,7 +385,7 @@ <translation></translation> </message> <message> - <location line="+72"/> + <location line="+73"/> <source>Select a file</source> <translation>选择一个文件</translation> </message> @@ -403,7 +403,7 @@ <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+867"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+687"/> <source>-- Encrypted Event (No keys found for decryption) --</source> <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment> <translation type="unfinished"></translation> @@ -427,18 +427,18 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+25"/> + <location line="+29"/> <source>-- Encrypted Event (Unknown event type) --</source> <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment> <translation type="unfinished"></translation> </message> <message> - <location line="+54"/> + <location line="+48"/> <source>Message redaction failed: %1</source> <translation type="unfinished">删除消息失败:%1</translation> </message> <message> - <location line="+453"/> + <location line="+454"/> <source>Save image</source> <translation type="unfinished">保存图像</translation> </message> @@ -457,11 +457,19 @@ <source>Save file</source> <translation type="unfinished"></translation> </message> + <message numerus="yes"> + <location line="+126"/> + <source>%1 and %2 are typing</source> + <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> </context> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+57"/> + <location filename="../qml/TimelineRow.qml" line="+104"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -551,17 +559,6 @@ </message> </context> <context> - <name>TypingDisplay</name> - <message numerus="yes"> - <location filename="../../src/TypingDisplay.cpp" line="+37"/> - <source>%1 and %2 are typing</source> - <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment> - <translation type="unfinished"> - <numerusform></numerusform> - </translation> - </message> -</context> -<context> <name>UserInfoWidget</name> <message> <location filename="../../src/UserInfoWidget.cpp" line="+87"/> @@ -572,7 +569,7 @@ <context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+171"/> + <location filename="../../src/UserSettingsPage.cpp" line="+172"/> <source>Minimize to tray</source> <translation>最小化至托盘</translation> </message> @@ -739,7 +736,7 @@ <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+104"/> + <location filename="../../src/Utils.cpp" line="+106"/> <source>Yesterday</source> <translation type="unfinished"></translation> </message> @@ -1014,7 +1011,7 @@ Media size: %2 <translation>启用加密失败:%1</translation> </message> <message> - <location line="+148"/> + <location line="+146"/> <source>Select an avatar</source> <translation>选择一个头像</translation> </message> @@ -1122,7 +1119,7 @@ Media size: %2 <context> <name>message-description sent:</name> <message> - <location filename="../../src/Utils.h" line="+95"/> + <location filename="../../src/Utils.h" line="+100"/> <source>You sent an audio clip</source> <translation type="unfinished"></translation> </message> @@ -1218,7 +1215,7 @@ Media size: %2 <context> <name>utils</name> <message> - <location filename="../../src/Utils.cpp" line="+282"/> + <location filename="../../src/Utils.cpp" line="+306"/> <source>sent a file.</source> <translation type="unfinished"></translation> </message> diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index bfea79ee..60a8e6c1 100644 --- a/resources/qml/TimelineView.qml +++ b/resources/qml/TimelineView.qml
@@ -38,7 +38,11 @@ Item { id: chat visible: timelineManager.timeline != null - anchors.fill: parent + + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + anchors.bottom: chatFooter.top anchors.leftMargin: 4 anchors.rightMargin: scrollbar.width @@ -179,6 +183,31 @@ Item { } } } + + } + + Rectangle { + id: chatFooter + + height: Math.max(16, typingDisplay.height) + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + z: 3 + + color: colors.window + + Text { + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.leftMargin: 10 + anchors.rightMargin: 10 + + id: typingDisplay + text: chat.model ? chat.model.formatTypingUsers(chat.model.typingUsers, chatFooter.color) : "" + color: colors.windowText + } } } } diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index 777709be..125e229a 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp
@@ -34,7 +34,6 @@ #include "Splitter.h" #include "TextInputWidget.h" #include "TopRoomBar.h" -#include "TypingDisplay.h" #include "UserInfoWidget.h" #include "UserSettingsPage.h" #include "Utils.h" @@ -130,11 +129,6 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent) text_input_ = new TextInputWidget(this); contentLayout_->addWidget(text_input_); - typingDisplay_ = new TypingDisplay(content_); - typingDisplay_->hide(); - connect( - text_input_, &TextInputWidget::heightChanged, typingDisplay_, &TypingDisplay::setOffset); - typingRefresher_ = new QTimer(this); typingRefresher_->setInterval(TYPING_REFRESH_TIMEOUT); @@ -225,19 +219,6 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent) } }); - connect(room_list_, &RoomList::roomChanged, this, [this](const QString &roomid) { - QStringList users; - - if (!userSettings_->isTypingNotificationsEnabled()) { - typingDisplay_->setUsers(users); - return; - } - - if (typingUsers_.find(roomid) != typingUsers_.end()) - users = typingUsers_[roomid]; - - typingDisplay_->setUsers(users); - }); connect(room_list_, &RoomList::roomChanged, text_input_, &TextInputWidget::stopTyping); connect(room_list_, &RoomList::roomChanged, this, &ChatPage::changeTopRoomInfo); connect(room_list_, &RoomList::roomChanged, splitter, &Splitter::showChatView); @@ -472,8 +453,6 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent) bool hasNotifications = false; for (const auto &room : rooms.join) { auto room_id = QString::fromStdString(room.first); - - updateTypingUsers(room_id, room.second.ephemeral.typing); updateRoomNotificationCount( room_id, room.second.unread_notifications.notification_count, @@ -787,38 +766,6 @@ ChatPage::removeRoom(const QString &room_id) } void -ChatPage::updateTypingUsers(const QString &roomid, const std::vector<std::string> &user_ids) -{ - if (!userSettings_->isTypingNotificationsEnabled()) - return; - - typingUsers_[roomid] = generateTypingUsers(roomid, user_ids); - - if (current_room_ == roomid) - typingDisplay_->setUsers(typingUsers_[roomid]); -} - -QStringList -ChatPage::generateTypingUsers(const QString &room_id, const std::vector<std::string> &typing_users) -{ - QStringList users; - auto local_user = utils::localUser(); - - for (const auto &uid : typing_users) { - const auto remote_user = QString::fromStdString(uid); - - if (remote_user == local_user) - continue; - - users.append(cache::displayName(room_id, remote_user)); - } - - users.sort(); - - return users; -} - -void ChatPage::removeLeftRooms(const std::map<std::string, mtx::responses::LeftRoom> &rooms) { for (auto it = rooms.cbegin(); it != rooms.cend(); ++it) { diff --git a/src/ChatPage.h b/src/ChatPage.h
index e4c0ef16..354a21f3 100644 --- a/src/ChatPage.h +++ b/src/ChatPage.h
@@ -48,7 +48,6 @@ class Splitter; class TextInputWidget; class TimelineViewManager; class TopRoomBar; -class TypingDisplay; class UserInfoWidget; class UserSettings; class NotificationsManager; @@ -187,8 +186,6 @@ private: using LeftRooms = std::map<std::string, mtx::responses::LeftRoom>; void removeLeftRooms(const LeftRooms &rooms); - void updateTypingUsers(const QString &roomid, const std::vector<std::string> &user_ids); - void loadStateFromCache(); void resetUI(); //! Decides whether or not to hide the group's sidebar. @@ -206,9 +203,6 @@ private: void showNotificationsDialog(const QPoint &point); - QStringList generateTypingUsers(const QString &room_id, - const std::vector<std::string> &typing_users); - QHBoxLayout *topLayout_; Splitter *splitter; @@ -228,7 +222,6 @@ private: TopRoomBar *top_bar_; TextInputWidget *text_input_; - TypingDisplay *typingDisplay_; QTimer connectivityTimer_; std::atomic_bool isConnected_; @@ -240,8 +233,6 @@ private: popups::UserMentions *user_mentions_popup_; - // Keeps track of the users currently typing on each room. - std::map<QString, QList<QString>> typingUsers_; QTimer *typingRefresher_; // Global user settings. diff --git a/src/TypingDisplay.cpp b/src/TypingDisplay.cpp deleted file mode 100644
index 43fabcd8..00000000 --- a/src/TypingDisplay.cpp +++ /dev/null
@@ -1,86 +0,0 @@ -#include <QDebug> -#include <QPainter> -#include <QPoint> -#include <QShowEvent> -#include <QtGlobal> - -#include "Config.h" -#include "TypingDisplay.h" -#include "ui/Painter.h" - -constexpr int LEFT_PADDING = 24; -constexpr int RECT_PADDING = 2; - -TypingDisplay::TypingDisplay(QWidget *parent) - : OverlayWidget(parent) - , offset_{conf::textInput::height} -{ - setFixedHeight(QFontMetrics(font()).height() + RECT_PADDING); - setAttribute(Qt::WA_TransparentForMouseEvents); -} - -void -TypingDisplay::setOffset(int margin) -{ - offset_ = margin; - move(0, parentWidget()->height() - offset_ - height()); -} - -void -TypingDisplay::setUsers(const QStringList &uid) -{ - move(0, parentWidget()->height() - offset_ - height()); - - text_.clear(); - - QString temp = text_ += - tr("%1 and %2 are typing", - "Multiple users are typing. First argument is a comma separated list of potentially " - "multiple users. Second argument is the last user of that list. (If only one user is " - "typing, %1 is empty. You should still use it in your string though to silence Qt " - "warnings.)", - uid.size()); - - if (uid.isEmpty()) { - hide(); - update(); - - return; - } - - QStringList uidWithoutLast = uid; - uidWithoutLast.pop_back(); - text_ = temp.arg(uidWithoutLast.join(", ")).arg(uid.back()); - - show(); - update(); -} - -void -TypingDisplay::paintEvent(QPaintEvent *) -{ - Painter p(this); - PainterHighQualityEnabler hq(p); - - QFont f; - f.setPointSizeF(f.pointSizeF() * 0.9); - - p.setFont(f); - p.setPen(QPen(textColor())); - - QRect region = rect(); - region.translate(LEFT_PADDING, 0); - - QFontMetrics fm(f); - text_ = fm.elidedText(text_, Qt::ElideRight, (double)(width() * 0.75)); - - QPainterPath path; -#if QT_VERSION < QT_VERSION_CHECK(5, 11, 0) - path.addRoundedRect(QRectF(0, 0, fm.width(text_) + 2 * LEFT_PADDING, height()), 3, 3); -#else - path.addRoundedRect( - QRectF(0, 0, fm.horizontalAdvance(text_) + 2 * LEFT_PADDING, height()), 3, 3); -#endif - p.fillPath(path, backgroundColor()); - p.drawText(region, Qt::AlignVCenter, text_); -} diff --git a/src/TypingDisplay.h b/src/TypingDisplay.h deleted file mode 100644
index 332d9c66..00000000 --- a/src/TypingDisplay.h +++ /dev/null
@@ -1,36 +0,0 @@ -#pragma once - -#include "ui/OverlayWidget.h" - -class QPaintEvent; - -class TypingDisplay : public OverlayWidget -{ - Q_OBJECT - - Q_PROPERTY(QColor textColor WRITE setTextColor READ textColor) - Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor) - -public: - TypingDisplay(QWidget *parent = nullptr); - - void setUsers(const QStringList &user_ids); - - void setTextColor(const QColor &color) { textColor_ = color; }; - QColor textColor() const { return textColor_; }; - - void setBackgroundColor(const QColor &color) { bgColor_ = color; }; - QColor backgroundColor() const { return bgColor_; }; - -public slots: - void setOffset(int margin); - -protected: - void paintEvent(QPaintEvent *event) override; - -private: - int offset_; - QColor textColor_; - QColor bgColor_; - QString text_; -}; diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 08c29927..2fd4b6d4 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp
@@ -1388,3 +1388,33 @@ TimelineModel::cacheMedia(QString eventId) emit mediaCached(mxcUrl, filename.filePath()); }); } + +QString +TimelineModel::formatTypingUsers(const std::vector<QString> &users, QColor bg) +{ + QString temp = + tr("%1 and %2 are typing", + "Multiple users are typing. First argument is a comma separated list of potentially " + "multiple users. Second argument is the last user of that list. (If only one user is " + "typing, %1 is empty. You should still use it in your string though to silence Qt " + "warnings.)", + users.size()); + + if (users.empty()) { + return ""; + } + + QStringList uidWithoutLast; + + auto formatUser = [this, bg](const QString &user_id) -> QString { + return QString("<font color=\"%1\">%2</font>") + .arg(userColor(user_id, bg).name()) + .arg(escapeEmoji(displayName(user_id).toHtmlEscaped())); + }; + + for (size_t i = 0; i + 1 < users.size(); i++) { + uidWithoutLast.append(formatUser(users[i])); + } + + return temp.arg(uidWithoutLast.join(", ")).arg(formatUser(users.back())); +} diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index ae505c17..6d351359 100644 --- a/src/timeline/TimelineModel.h +++ b/src/timeline/TimelineModel.h
@@ -120,6 +120,8 @@ class TimelineModel : public QAbstractListModel Q_OBJECT Q_PROPERTY( int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged) + Q_PROPERTY(std::vector<QString> typingUsers READ typingUsers WRITE updateTypingUsers NOTIFY + typingUsersChanged) public: explicit TimelineModel(TimelineViewManager *manager, QString room_id, QObject *parent = 0); @@ -162,6 +164,7 @@ public: Q_INVOKABLE QString displayName(QString id) const; Q_INVOKABLE QString avatarUrl(QString id) const; Q_INVOKABLE QString formatDateSeparator(QDate date) const; + Q_INVOKABLE QString formatTypingUsers(const std::vector<QString> &users, QColor bg); Q_INVOKABLE QString escapeEmoji(QString str) const; Q_INVOKABLE void viewRawMessage(QString id) const; @@ -183,6 +186,14 @@ public slots: int currentIndex() const { return idToIndex(currentId); } void markEventsAsRead(const std::vector<QString> &event_ids); QVariantMap getDump(QString eventId) const; + void updateTypingUsers(const std::vector<QString> &users) + { + if (this->typingUsers_ != users) { + this->typingUsers_ = users; + emit typingUsersChanged(typingUsers_); + } + } + std::vector<QString> typingUsers() const { return typingUsers_; } private slots: // Add old events at the top of the timeline. @@ -202,6 +213,7 @@ signals: void mediaCached(QString mxcUrl, QString cacheUrl); void newEncryptedImage(mtx::crypto::EncryptedFile encryptionInfo); void replyFetched(QString requestingEvent, mtx::events::collections::TimelineEvents event); + void typingUsersChanged(std::vector<QString> users); private: DecryptionResult decryptEvent( @@ -232,6 +244,7 @@ private: QHash<QString, QColor> userColors; QString currentId; + std::vector<QString> typingUsers_; TimelineViewManager *manager_; diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index ddbc6af8..c7a4e50e 100644 --- a/src/timeline/TimelineViewManager.cpp +++ b/src/timeline/TimelineViewManager.cpp
@@ -8,6 +8,7 @@ #include "ColorImageProvider.h" #include "DelegateChooser.h" #include "Logging.h" +#include "MatrixClient.h" #include "MxcImageProvider.h" #include "UserSettingsPage.h" #include "dialogs/ImageOverlay.h" @@ -92,10 +93,21 @@ TimelineViewManager::TimelineViewManager(QWidget *parent) void TimelineViewManager::sync(const mtx::responses::Rooms &rooms) { - for (auto it = rooms.join.cbegin(); it != rooms.join.cend(); ++it) { + for (const auto &[room_id, room] : rooms.join) { // addRoom will only add the room, if it doesn't exist - addRoom(QString::fromStdString(it->first)); - models.value(QString::fromStdString(it->first))->addEvents(it->second.timeline); + addRoom(QString::fromStdString(room_id)); + const auto &room_model = models.value(QString::fromStdString(room_id)); + room_model->addEvents(room.timeline); + + if (ChatPage::instance()->userSettings()->isTypingNotificationsEnabled()) { + std::vector<QString> typing; + typing.reserve(room.ephemeral.typing.size()); + for (const auto &user : room.ephemeral.typing) { + if (user != http::client()->user_id().to_string()) + typing.push_back(QString::fromStdString(user)); + } + room_model->updateTypingUsers(typing); + } } this->isInitialSync_ = false;