Compare commits

..

2 Commits

Author SHA1 Message Date
James Graham
341c439edf Fix tests 2026-02-28 10:21:11 +00:00
James Graham
1d5ec4d239 Plumb the adding of message edit text back in.
This should also improve edits where there is code or quotes.
2026-02-27 17:18:19 +00:00
20 changed files with 280 additions and 106 deletions

View File

@@ -109,6 +109,34 @@ TestCase {
compare(spyCursor.count, 5);
}
function test_longFixedChars(): void {
textEdit.forceActiveFocus();
testHelper.setFixedChars("111", "222");
compare(textEdit.text, "111222");
compare(textEdit.cursorPosition, 3);
compare(spyCursor.count, 0);
keyClick("b");
compare(textEdit.text, "111b222");
compare(textEdit.cursorPosition, 4);
compare(spyCursor.count, 1);
keyClick(Qt.Key_Left);
compare(textEdit.text, "111b222");
compare(textEdit.cursorPosition, 3);
compare(spyCursor.count, 2);
keyClick(Qt.Key_Left);
compare(textEdit.text, "111b222");
compare(textEdit.cursorPosition, 3);
compare(spyCursor.count, 3);
keyClick(Qt.Key_Right);
compare(textEdit.text, "111b222");
compare(textEdit.cursorPosition, 4);
compare(spyCursor.count, 4);
keyClick(Qt.Key_Right);
compare(textEdit.text, "111b222");
compare(textEdit.cursorPosition, 4);
compare(spyCursor.count, 5);
}
function test_document(): void {
// We can't get to the QTextDocument from QML so we have to use a helper function.
compare(testHelper.compareDocuments(textEdit.textDocument), true);

View File

@@ -626,10 +626,10 @@ void TextHandlerTest::componentOutput_data()
MessageComponent{MessageComponentType::Code, u"Some code"_s, QVariantMap{{u"class"_s, u"html"_s}}}};
QTest::newRow("quote") << u"<p>Text</p>\n<blockquote>\n<p>blockquote</p>\n</blockquote>"_s
<< QList<MessageComponent>{MessageComponent{MessageComponentType::Text, u"Text"_s, {}},
MessageComponent{MessageComponentType::Quote, u"blockquote"_s, {}}};
MessageComponent{MessageComponentType::Quote, u"\"blockquote\""_s, {}}};
QTest::newRow("multiple paragraph quote") << u"<blockquote>\n<p>blockquote</p>\n<p>next paragraph</p>\n</blockquote>"_s
<< QList<MessageComponent>{
MessageComponent{MessageComponentType::Quote, u"<p>blockquote</p>\n<p>next paragraph</p>"_s, {}}};
MessageComponent{MessageComponentType::Quote, u"<p>\"blockquote</p>\n<p>next paragraph\"</p>"_s, {}}};
QTest::newRow("no tag first paragraph") << u"Text\n<p>Text</p>"_s
<< QList<MessageComponent>{MessageComponent{MessageComponentType::Text, u"Text"_s, {}},
MessageComponent{MessageComponentType::Text, u"Text"_s, {}}};

View File

@@ -490,7 +490,6 @@
<content_attribute id="social-chat">intense</content_attribute>
</content_rating>
<releases>
<release version="25.12.3" date="2026-03-05"/>
<release version="25.12.2" date="2026-02-05"/>
<release version="25.12.1" date="2026-01-08"/>
<release version="25.12.0" date="2025-12-11"/>

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: neochat\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2026-02-27 00:43+0000\n"
"PO-Revision-Date: 2026-02-27 07:24+0100\n"
"PO-Revision-Date: 2026-02-26 08:47+0100\n"
"Last-Translator: Josep M. Ferrer <txemaq@gmail.com>\n"
"Language-Team: Catalan <kde-i18n-ca@kde.org>\n"
"Language: ca\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Lokalize 25.12.2\n"
"X-Generator: Lokalize 25.04.0\n"
#: src/app/controller.cpp:170
#, kde-format
@@ -1733,13 +1733,14 @@ msgstr "Surt"
#, kde-format
msgctxt "As in enter starts a new line in the chat bar"
msgid "Enter starts a new line"
msgstr "Retorn comença una línia nova"
msgstr ""
#: src/chatbar/ChatBar.qml:85
#, kde-format
#, fuzzy, kde-format
#| msgid "%1 sent a message"
msgctxt "As in enter starts send the chat message"
msgid "Enter sends the message"
msgstr "Retorn envia el missatge"
msgstr "%1 ha enviat un missatge"
#: src/chatbar/ChatBarCore.qml:79
#, kde-format
@@ -2038,13 +2039,13 @@ msgstr "Envia un missatge de veu"
#, kde-format
msgctxt "@action:button"
msgid "Hide Rich Text Controls"
msgstr "Oculta els controls de text enriquit"
msgstr ""
#: src/chatbar/SendBar.qml:195
#, kde-format
msgctxt "@action:button"
msgid "Show Rich Text Controls"
msgstr "Mostra els controls de text enriquit"
msgstr ""
#: src/chatbar/SendBar.qml:209
#, kde-format

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: neochat\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2026-02-27 00:43+0000\n"
"PO-Revision-Date: 2026-02-27 07:24+0100\n"
"PO-Revision-Date: 2026-02-26 08:47+0100\n"
"Last-Translator: Josep M. Ferrer <txemaq@gmail.com>\n"
"Language-Team: Catalan <kde-i18n-ca@kde.org>\n"
"Language: ca@valencia\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Lokalize 25.12.2\n"
"X-Generator: Lokalize 25.04.0\n"
#: src/app/controller.cpp:170
#, kde-format
@@ -1734,13 +1734,14 @@ msgstr "Ix"
#, kde-format
msgctxt "As in enter starts a new line in the chat bar"
msgid "Enter starts a new line"
msgstr "«Retorn» comença una línia nova"
msgstr ""
#: src/chatbar/ChatBar.qml:85
#, kde-format
#, fuzzy, kde-format
#| msgid "%1 sent a message"
msgctxt "As in enter starts send the chat message"
msgid "Enter sends the message"
msgstr "«Retorn» envia el missatge"
msgstr "%1 ha enviat un missatge"
#: src/chatbar/ChatBarCore.qml:79
#, kde-format
@@ -2039,13 +2040,13 @@ msgstr "Envia un missatge de veu"
#, kde-format
msgctxt "@action:button"
msgid "Hide Rich Text Controls"
msgstr "Oculta els controls de text enriquit"
msgstr ""
#: src/chatbar/SendBar.qml:195
#, kde-format
msgctxt "@action:button"
msgid "Show Rich Text Controls"
msgstr "Mostra els controls de text enriquit"
msgstr ""
#: src/chatbar/SendBar.qml:209
#, kde-format
@@ -7739,3 +7740,7 @@ msgid "%2 is typing"
msgid_plural "%2 are typing"
msgstr[0] "%2 està escrivint"
msgstr[1] "%2 estan escrivint"
#~ msgctxt "@action:button"
#~ msgid "Rich Text"
#~ msgstr "Text enriquit"

View File

@@ -7,7 +7,7 @@ msgstr ""
"Project-Id-Version: neochat\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2026-02-27 00:43+0000\n"
"PO-Revision-Date: 2026-02-27 09:12+0200\n"
"PO-Revision-Date: 2026-02-26 09:10+0200\n"
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"Language-Team: צוות התרגום של KDE ישראל\n"
"Language: he\n"
@@ -1200,23 +1200,31 @@ msgid "Unlock using Recovery Key"
msgstr "שחרור באמצעות מפתח שחזור"
#: src/app/qml/UnlockSSSSDialog.qml:52
#, kde-format
#, fuzzy, kde-format
#| msgctxt "@info"
#| msgid ""
#| "If you have a security key or backup passphrase for this account, enter "
#| "it below or upload it as a file."
msgctxt "@info"
msgid ""
"If you have a recovery key (also known as a “security key” or “backup "
"passphrase”), enter it below or upload it as a file."
msgstr ""
"אם יש לך מפתח שחזור (ידוע גם בשם „מפתח אבטחה או ביטוי צופן לגיבוי”), יש "
מלא אותו כאן או להעלות אותו כקובץ."
"אם יש לך מפתח אבטחה או ביטוי צופן לגיבוי לחשבון הזה, יש למלא אותו כאן או "
"להעלות אותו כקובץ."
#: src/app/qml/UnlockSSSSDialog.qml:56
#, kde-format
#, fuzzy, kde-format
#| msgctxt "@label:textbox"
#| msgid "Security Key:"
msgctxt "@label:textbox"
msgid "Recovery Key:"
msgstr "מפתח שחזור:"
msgstr "מפתח אבטחה:"
#: src/app/qml/UnlockSSSSDialog.qml:61
#, kde-format
#, fuzzy, kde-format
#| msgctxt "@action:button"
#| msgid "Upload from File"
msgctxt "@action:button"
msgid "Upload From File"
msgstr "העלאה מקובץ"
@@ -1234,16 +1242,23 @@ msgid "Unlock from Cross-Signing"
msgstr "שחרור נעילה מחתימה צולבת"
#: src/app/qml/UnlockSSSSDialog.qml:86
#, kde-format
#, fuzzy, kde-format
#| msgctxt "@info"
#| msgid ""
#| "If you have previously verified this device, you can try loading the "
#| "backup key from other devices by clicking the button below."
msgctxt "@info"
msgid ""
"If you have previously verified this device, you request encryption keys "
"from other verified devices."
msgstr ""
"אם אימתת את המכשיר הזה בעבר, אפשר לנסות לבקש את מפתחות ההצפנה ממכשירים אחרים."
"אם אימתת את המכשיר הזה בעבר, אפשר לנסות לטעון את מפתח הגיבוי ממכשירים אחרים "
"בלחיצה על הכפתור שלהלן."
#: src/app/qml/UnlockSSSSDialog.qml:91
#, kde-format
#, fuzzy, kde-format
#| msgctxt "@action:button"
#| msgid "Request from other Devices"
msgctxt "@action:button"
msgid "Request From Other Devices"
msgstr "בקשה מהתקנים אחרים"
@@ -1426,10 +1441,12 @@ msgid "Mutual Rooms"
msgstr "חדרים משותפים"
#: src/app/qml/UserDetailDialog.qml:424
#, kde-format
#, fuzzy, kde-format
#| msgctxt "@info"
#| msgid "No rooms found"
msgctxt "@info:label"
msgid "No rooms in common"
msgstr "אין חדרים במשותף"
msgstr "לא נמצאו חדרים"
#: src/app/qml/UserDetailDialog.qml:459
#, kde-format
@@ -4795,36 +4812,48 @@ msgid "Space Settings"
msgstr "הגדרות מרחב"
#: src/rooms/SpaceListContextMenu.qml:85 src/spaces/SpaceHomePage.qml:109
#, kde-format
#, fuzzy, kde-format
#| msgctxt ""
#| "@action:button 'Report' as in 'Report this user to the administrators'"
#| msgid "Report…"
msgctxt ""
"@action:button 'Report' as in 'Report this space to the administrators'"
msgid "Report…"
msgstr "דיווח…"
#: src/rooms/SpaceListContextMenu.qml:90 src/spaces/SpaceHomePage.qml:114
#, kde-format
#, fuzzy, kde-format
#| msgctxt "@title:dialog"
#| msgid "Report User"
msgctxt "@title:dialog"
msgid "Report Space"
msgstr "דיווח על מרחב"
msgstr "דיווח על משתמש"
#: src/rooms/SpaceListContextMenu.qml:91 src/spaces/SpaceHomePage.qml:115
#, kde-format
#, fuzzy, kde-format
#| msgctxt "@info:placeholder"
#| msgid "Optionally give a reason for reporting this user"
msgctxt "@info:placeholder"
msgid "Optionally give a reason for reporting this space"
msgstr "הסיבה לדיווח על המרחב הזה כרשות"
msgstr "הסיבה לדיווח על המשתמש הזה כרשות"
#: src/rooms/SpaceListContextMenu.qml:93 src/spaces/SpaceHomePage.qml:117
#, kde-format
#, fuzzy, kde-format
#| msgctxt ""
#| "@action:button 'Report' as in 'Report this user to the administrators'"
#| msgid "Report"
msgctxt ""
"@action:button 'Report' as in 'Report this space to the administrators'"
msgid "Report"
msgstr "דיווח"
#: src/rooms/SpaceListContextMenu.qml:97 src/spaces/SpaceHomePage.qml:121
#, kde-format
#, fuzzy, kde-format
#| msgctxt "@title"
#| msgid "Report User"
msgctxt "@title"
msgid "Report Space"
msgstr "דיווח על מרחב"
msgstr "דיווח על משתמש"
#: src/rooms/SpaceListContextMenu.qml:107
#, kde-format
@@ -6106,7 +6135,9 @@ msgid "Ignored Users"
msgstr "משתמשים מוחרגים"
#: src/settings/NeoChatSecurityPage.qml:43
#, kde-format
#, fuzzy, kde-format
#| msgctxt "@title"
#| msgid "Messages"
msgctxt "@title:group"
msgid "Messages"
msgstr "הודעות"
@@ -6128,7 +6159,8 @@ msgstr ""
"הקישורים המקדימות יושבתו בכל החדרים."
#: src/settings/NeoChatSecurityPage.qml:62
#, kde-format
#, fuzzy, kde-format
#| msgid "Send typing notifications"
msgctxt "@label:checkbox"
msgid "Send typing notifications"
msgstr "לשלוח התראות הקלדה"
@@ -6154,16 +6186,20 @@ msgid "Everyone"
msgstr "כולם"
#: src/settings/NeoChatSecurityPage.qml:93
#, kde-format
#, fuzzy, kde-format
#| msgctxt "@option:check"
#| msgid "Anyone can find and join."
msgctxt "@info:description"
msgid "Anyone can send you invites."
msgstr "כולם יכולים לשלוח לך הזמנות."
msgstr "כולם יוכלים למצוא ולהצטרף."
#: src/settings/NeoChatSecurityPage.qml:98
#, kde-format
#, fuzzy, kde-format
#| msgctxt "Room permission type"
#| msgid "Ban users"
msgctxt "@option:check"
msgid "Known users"
msgstr "משתמשים מוכרים"
msgstr "חסימת משתמשים"
#: src/settings/NeoChatSecurityPage.qml:99
#, kde-format
@@ -6234,10 +6270,12 @@ msgid "Import Keys"
msgstr "ייבוא מפתחות"
#: src/settings/NeoChatSecurityPage.qml:151
#, kde-format
#, fuzzy, kde-format
#| msgctxt "@info"
#| msgid "Import encryption keys from a backup."
msgctxt "@info"
msgid "Import encryption keys from a backup file."
msgstr "ייבוא מפתחות הצפנה מקובץ גיבוי."
msgstr "ייבוא מפתחות הצפנה מגיבוי."
#: src/settings/NeoChatSecurityPage.qml:157
#, kde-format
@@ -6258,10 +6296,12 @@ msgid "Export Keys"
msgstr "ייצוא מפתחות"
#: src/settings/NeoChatSecurityPage.qml:174
#, kde-format
#, fuzzy, kde-format
#| msgctxt "@info"
#| msgid "Export this device's encryption keys."
msgctxt "@info"
msgid "Export this device's encryption keys to a file."
msgstr "ייצוא מפתחות ההצפנה של המכשיר הזה לקובץ."
msgstr "ייצוא מפתחות ההצפנה של המכשיר הזה."
#: src/settings/NeoChatSecurityPage.qml:180
#, kde-format
@@ -7644,11 +7684,12 @@ msgstr[1] "הקלדה מצד %2"
msgstr[2] "הקלדה מצד %2"
msgstr[3] "הקלדה מצד %2"
#, fuzzy
#~| msgctxt "@label:textbox"
#~| msgid "Link Text:"
#~ msgctxt "@action:button"
#~ msgid "Rich Text"
#~ msgstr "טקסט עשיר"
#~ msgstr "טקסט קישור:"
#~ msgctxt "@action:button"
#~ msgid "Enter rich text mode"

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: neochat\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2026-02-27 00:43+0000\n"
"PO-Revision-Date: 2026-02-27 05:34+0100\n"
"PO-Revision-Date: 2026-02-26 05:48+0100\n"
"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
"Language-Team: Georgian <kde-i18n-doc@kde.org>\n"
"Language: ka\n"
@@ -1706,13 +1706,14 @@ msgstr "დატოვება"
#, kde-format
msgctxt "As in enter starts a new line in the chat bar"
msgid "Enter starts a new line"
msgstr "Enter იწყებს ახალ ხაზს"
msgstr ""
#: src/chatbar/ChatBar.qml:85
#, kde-format
#, fuzzy, kde-format
#| msgid "%1 sent a message"
msgctxt "As in enter starts send the chat message"
msgid "Enter sends the message"
msgstr "ღილაკი Enter აგზავნის შეტყობინება"
msgstr "%1-მა გააგზავნ შეტყობინება"
#: src/chatbar/ChatBarCore.qml:79
#, kde-format
@@ -2011,13 +2012,13 @@ msgstr "ხმოვანი შეტყობინების გაგზ
#, kde-format
msgctxt "@action:button"
msgid "Hide Rich Text Controls"
msgstr "მდიდარი ტექსტის კონტროლის ელემენტების დამალვა"
msgstr ""
#: src/chatbar/SendBar.qml:195
#, kde-format
msgctxt "@action:button"
msgid "Show Rich Text Controls"
msgstr "მდიდარი ტექსტის კონტროლის ელემენტების ჩვენება"
msgstr ""
#: src/chatbar/SendBar.qml:209
#, kde-format

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: neochat\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2026-02-27 00:43+0000\n"
"PO-Revision-Date: 2026-02-27 10:53+0100\n"
"PO-Revision-Date: 2026-02-26 10:03+0100\n"
"Last-Translator: Freek de Kruijf <freekdekruijf@kde.nl>\n"
"Language-Team: \n"
"Language: nl\n"
@@ -1729,13 +1729,14 @@ msgstr "Afsluiten"
#, kde-format
msgctxt "As in enter starts a new line in the chat bar"
msgid "Enter starts a new line"
msgstr "Enter start een nieuwe regel"
msgstr ""
#: src/chatbar/ChatBar.qml:85
#, kde-format
#, fuzzy, kde-format
#| msgid "%1 sent a message"
msgctxt "As in enter starts send the chat message"
msgid "Enter sends the message"
msgstr "Enter verstuurt het bericht"
msgstr "%1 verzend een bericht"
#: src/chatbar/ChatBarCore.qml:79
#, kde-format
@@ -2034,13 +2035,13 @@ msgstr "Een stembericht versturen"
#, kde-format
msgctxt "@action:button"
msgid "Hide Rich Text Controls"
msgstr "Besturingen van opgemaakte tekst verbergen"
msgstr ""
#: src/chatbar/SendBar.qml:195
#, kde-format
msgctxt "@action:button"
msgid "Show Rich Text Controls"
msgstr "Besturingen van opgemaakte tekst tonen"
msgstr ""
#: src/chatbar/SendBar.qml:209
#, kde-format

View File

@@ -11,7 +11,7 @@ msgstr ""
"Project-Id-Version: neochat\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2026-02-27 00:43+0000\n"
"PO-Revision-Date: 2026-02-27 07:41-0300\n"
"PO-Revision-Date: 2026-02-26 08:46-0300\n"
"Last-Translator: Marcus Gama <marcus.gama@gmail.com>\n"
"Language-Team: Brazilian Portuguese <kde-i18n-pt_BR@kde.org>\n"
"Language: pt_BR\n"
@@ -1731,13 +1731,14 @@ msgstr "Sair"
#, kde-format
msgctxt "As in enter starts a new line in the chat bar"
msgid "Enter starts a new line"
msgstr "A tecla Enter inicia uma nova linha"
msgstr ""
#: src/chatbar/ChatBar.qml:85
#, kde-format
#, fuzzy, kde-format
#| msgid "%1 sent a message"
msgctxt "As in enter starts send the chat message"
msgid "Enter sends the message"
msgstr "A tecla Enter envia a mensagem"
msgstr "%1 enviou uma mensagem"
#: src/chatbar/ChatBarCore.qml:79
#, kde-format
@@ -2036,13 +2037,13 @@ msgstr "Enviar uma mensagem de voz"
#, kde-format
msgctxt "@action:button"
msgid "Hide Rich Text Controls"
msgstr "Ocultar controles de formatação de texto"
msgstr ""
#: src/chatbar/SendBar.qml:195
#, kde-format
msgctxt "@action:button"
msgid "Show Rich Text Controls"
msgstr "Mostrar controles de formatação de texto"
msgstr ""
#: src/chatbar/SendBar.qml:209
#, kde-format

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: neochat\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2026-02-27 00:43+0000\n"
"PO-Revision-Date: 2026-02-27 07:39+0100\n"
"PO-Revision-Date: 2026-02-26 07:00+0100\n"
"Last-Translator: Matjaž Jeran <matjaz.jeran@amis.net>\n"
"Language-Team: Slovenian <lugos-slo@lugos.si>\n"
"Language: sl\n"
@@ -1720,13 +1720,14 @@ msgstr "Zapusti"
#, kde-format
msgctxt "As in enter starts a new line in the chat bar"
msgid "Enter starts a new line"
msgstr "Tipka enter začenja novo vrstico"
msgstr ""
#: src/chatbar/ChatBar.qml:85
#, kde-format
#, fuzzy, kde-format
#| msgid "%1 sent a message"
msgctxt "As in enter starts send the chat message"
msgid "Enter sends the message"
msgstr "Tipka enter poišilja sporočilo"
msgstr "%1 je poslal sporočilo"
#: src/chatbar/ChatBarCore.qml:79
#, kde-format
@@ -2025,13 +2026,13 @@ msgstr "Pošlji glasovno sporočilo"
#, kde-format
msgctxt "@action:button"
msgid "Hide Rich Text Controls"
msgstr "Skrij kontrole obogatenega besedila"
msgstr ""
#: src/chatbar/SendBar.qml:195
#, kde-format
msgctxt "@action:button"
msgid "Show Rich Text Controls"
msgstr "Pokaži kontrole obogatenega besedila"
msgstr ""
#: src/chatbar/SendBar.qml:209
#, kde-format

View File

@@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: neochat\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2026-02-27 00:43+0000\n"
"PO-Revision-Date: 2026-02-27 07:54+0300\n"
"PO-Revision-Date: 2026-02-26 07:53+0300\n"
"Last-Translator: Emir SARI <emir_sari@icloud.com>\n"
"Language-Team: Turkish <kde-l10n-tr@kde.org>\n"
"Language: tr\n"
@@ -1718,13 +1718,14 @@ msgstr "Çık"
#, kde-format
msgctxt "As in enter starts a new line in the chat bar"
msgid "Enter starts a new line"
msgstr "Giriş düğmesi yeni bir satır başlatır"
msgstr ""
#: src/chatbar/ChatBar.qml:85
#, kde-format
#, fuzzy, kde-format
#| msgid "%1 sent a message"
msgctxt "As in enter starts send the chat message"
msgid "Enter sends the message"
msgstr "Giriş düğmesi iletiyi gönderir"
msgstr "%1 bir ileti gönderdi"
#: src/chatbar/ChatBarCore.qml:79
#, kde-format
@@ -2023,13 +2024,13 @@ msgstr "Ses İletisi Gönder"
#, kde-format
msgctxt "@action:button"
msgid "Hide Rich Text Controls"
msgstr "Zengin Metin Denetimlerini Gizle"
msgstr ""
#: src/chatbar/SendBar.qml:195
#, kde-format
msgctxt "@action:button"
msgid "Show Rich Text Controls"
msgstr "Zengin Metin Denetimlerini Göster"
msgstr ""
#: src/chatbar/SendBar.qml:209
#, kde-format

View File

@@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: neochat\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2026-02-27 00:43+0000\n"
"PO-Revision-Date: 2026-02-27 16:30+0200\n"
"PO-Revision-Date: 2026-02-26 09:59+0200\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
"Language: uk\n"
@@ -1729,13 +1729,14 @@ msgstr "Вийти"
#, kde-format
msgctxt "As in enter starts a new line in the chat bar"
msgid "Enter starts a new line"
msgstr "Клавіша Enter починає новий рядок"
msgstr ""
#: src/chatbar/ChatBar.qml:85
#, kde-format
#, fuzzy, kde-format
#| msgid "%1 sent a message"
msgctxt "As in enter starts send the chat message"
msgid "Enter sends the message"
msgstr "Клавіша Enter надсилає повідомлення"
msgstr "%1 надіслано повідомлення"
#: src/chatbar/ChatBarCore.qml:79
#, kde-format
@@ -2034,13 +2035,13 @@ msgstr "Надіслати голосове повідомлення"
#, kde-format
msgctxt "@action:button"
msgid "Hide Rich Text Controls"
msgstr "Приховати керування форматованим текстом"
msgstr ""
#: src/chatbar/SendBar.qml:195
#, kde-format
msgctxt "@action:button"
msgid "Show Rich Text Controls"
msgstr "Показати керування форматованим текстом"
msgstr ""
#: src/chatbar/SendBar.qml:209
#, kde-format

View File

@@ -1684,10 +1684,12 @@ msgid "Enter starts a new line"
msgstr ""
#: src/chatbar/ChatBar.qml:85
#, kde-format
#, fuzzy, kde-format
#| msgctxt "@action:button"
#| msgid "Send message"
msgctxt "As in enter starts send the chat message"
msgid "Enter sends the message"
msgstr ""
msgstr "发送消息"
#: src/chatbar/ChatBarCore.qml:79
#, kde-format

View File

@@ -135,7 +135,23 @@ QString ChatBarCache::relationMessage() const
return {};
}
if (auto [event, _] = m_room->getEvent(m_relationId); event != nullptr) {
return EventHandler::markdownBody(event);
return EventHandler::rawMessageBody(*event);
}
return {};
}
QList<MessageComponent> ChatBarCache::relationComponents() const
{
if (!m_room) {
qCWarning(ChatBar) << "ChatBarCache:" << __FUNCTION__ << "called after room was deleted";
return {};
}
if (m_relationId.isEmpty()) {
return {};
}
if (auto [event, _] = m_room->getEvent(m_relationId); event != nullptr) {
TextHandler handler;
return TextHandler().textComponents(EventHandler::rawMessageBody(*event), EventHandler::messageBodyInputFormat(*event), m_room, event);
}
return {};
}

View File

@@ -15,6 +15,7 @@ namespace Quotient
class RoomMember;
}
struct MessageComponent;
class NeoChatRoom;
/**
@@ -91,13 +92,6 @@ class ChatBarCache : public QObject
*/
Q_PROPERTY(bool relationAuthorIsPresent READ relationAuthorIsPresent NOTIFY relationAuthorIsPresentChanged)
/**
* @brief The content of the related message.
*
* Will be QString() if no related message.
*/
Q_PROPERTY(QString relationMessage READ relationMessage NOTIFY relationIdChanged)
/**
* @brief Whether the chat bar is replying in a thread.
*/
@@ -147,6 +141,7 @@ public:
bool relationAuthorIsPresent() const;
QString relationMessage() const;
QList<MessageComponent> relationComponents() const;
bool isThreaded() const;
QString threadId() const;

View File

@@ -188,7 +188,7 @@ void ChatMarkdownHelper::checkMarkdown(int position, int charsRemoved, int chars
// This can happen when formatting is applied.
if (charsAdded == charsRemoved) {
return;
} else if ((m_textItem->textFormat() && m_textItem->textFormat() == Qt::TextFormat::PlainText) || m_textItem->isCompleting || charsRemoved > charsAdded || charsAdded - charsRemoved > 1) {
} else if (m_textItem->isCompleting || charsRemoved > charsAdded || charsAdded - charsRemoved > 1) {
updatePosition(std::max(0, position - charsRemoved + charsAdded));
return;
}

View File

@@ -9,7 +9,6 @@
#include <QTextCursor>
#include <Kirigami/Platform/PlatformTheme>
#include <qtextdocument.h>
#include "chatbarsyntaxhighlighter.h"
#include "neochatroom.h"
@@ -165,23 +164,52 @@ void ChatTextItemHelper::initialize()
int finalCursorPos = cursor.position();
if (doc->isEmpty() && !m_initialFragment.isEmpty()) {
cursor.insertFragment(m_initialFragment);
if (cursor.blockFormat().bottomMargin() > 0) {
auto blockFormat = cursor.blockFormat();
blockFormat.setBottomMargin(0);
cursor.setBlockFormat(blockFormat);
}
finalCursorPos = cursor.position();
}
if (!m_fixedStartChars.isEmpty() && doc->characterAt(0) != m_fixedStartChars) {
if (!m_fixedStartChars.isEmpty()) {
cursor.movePosition(QTextCursor::Start);
cursor.insertText(m_fixedStartChars);
finalCursorPos += m_fixedStartChars.length();
cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, m_fixedStartChars.length());
if (cursor.selectedText() != m_fixedStartChars) {
cursor.movePosition(QTextCursor::Start);
cursor.insertText(m_fixedStartChars);
finalCursorPos += m_fixedStartChars.length();
}
}
if (!m_fixedStartChars.isEmpty() && doc->characterAt(doc->characterCount()) != m_fixedStartChars) {
if (!m_fixedStartChars.isEmpty()) {
cursor.movePosition(QTextCursor::End);
cursor.keepPositionOnInsert();
cursor.insertText(m_fixedEndChars);
cursor.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor, m_fixedEndChars.length());
if (cursor.selectedText() != m_fixedEndChars) {
cursor.movePosition(QTextCursor::End);
cursor.insertText(m_fixedEndChars);
}
}
setCursorPosition(finalCursorPos);
cursor.endEditBlock();
qWarning() << doc->toRawText();
const auto blockProperties = cursor.blockFormat().properties();
for (const auto &property : blockProperties.keys()) {
qWarning() << static_cast<QTextFormat::Property>(property) << blockProperties[property];
}
const auto textProperties = cursor.charFormat().properties();
for (const auto &property : textProperties.keys()) {
qWarning() << static_cast<QTextFormat::Property>(property) << textProperties[property];
}
const auto currentList = cursor.currentList();
if (currentList) {
const auto listProperties = currentList->format().properties();
for (const auto &property : listProperties.keys()) {
qWarning() << static_cast<QTextFormat::Property>(property) << listProperties[property];
}
}
m_initializingChars = false;
}

View File

@@ -402,9 +402,9 @@ QString TextHandler::stripBlockTags(QString string, const QString &tagType) cons
}
// This is not a normal quotation mark but U+201C
string.insert(startQuotationIndex, u'');
string.insert(startQuotationIndex, u"\""_s);
// This is U+201D
string.insert(endQuotationIndex, u'');
string.insert(endQuotationIndex, u"\""_s);
}
return string;

View File

@@ -13,8 +13,10 @@
#include "enums/chatbartype.h"
#include "enums/messagecomponenttype.h"
#include "enums/richformat.h"
#include "messagecomponent.h"
#include "messagecontentmodel.h"
#include "neochatroom.h"
#include "texthandler.h"
namespace
{
@@ -51,6 +53,18 @@ ChatBarMessageContentModel::ChatBarMessageContentModel(QObject *parent)
textItem->setRoom(m_room);
}
}
// We can't guarantee whether room or type is intialised first so we have to handle.
if (!m_room || !unhandledTypeChange) {
return;
}
connectCache(m_room->cacheForType(*unhandledTypeChange));
unhandledTypeChange = std::nullopt;
const auto newCache = m_room->cacheForType(m_type);
if (newCache && newCache->isEditing()) {
initializeEdit();
return;
}
initializeFromCache();
});
connect(this, &ChatBarMessageContentModel::typeChanged, this, [this](ChatBarType::Type oldType) {
for (const auto &component : std::as_const(m_components)) {
@@ -59,9 +73,15 @@ ChatBarMessageContentModel::ChatBarMessageContentModel(QObject *parent)
}
}
if (!m_room) {
unhandledTypeChange = oldType;
return;
}
connectCache(m_room->cacheForType(oldType));
const auto newCache = m_room->cacheForType(m_type);
if (newCache && newCache->isEditing()) {
initializeEdit();
return;
}
initializeFromCache();
});
connect(m_markdownHelper, &ChatMarkdownHelper::unhandledBlockFormat, this, &ChatBarMessageContentModel::insertStyleAtCursor);
@@ -90,9 +110,8 @@ void ChatBarMessageContentModel::connectCache(ChatBarCache *oldCache)
}
const auto currentCache = m_room->cacheForType(m_type);
updateReplyModel();
refocusCurrentComponent();
if (currentCache->isEditing()) {
initializeFromCache();
initializeEdit();
}
});
connect(m_room->cacheForType(m_type), &ChatBarCache::attachmentPathChanged, this, [this]() {
@@ -152,6 +171,38 @@ void ChatBarMessageContentModel::initializeFromCache()
Q_EMIT focusRowChanged();
}
void ChatBarMessageContentModel::initializeEdit()
{
clearModel();
const auto currentCache = m_room->cacheForType(m_type);
auto components = currentCache->relationComponents();
if (components.isEmpty()) {
initializeModel();
return;
}
beginResetModel();
std::ranges::for_each(components, [this](MessageComponent component) {
if (MessageComponentType::isTextType(component.type)) {
const auto textItemWrapper = new ChatTextItemHelper(this);
const auto initialFragment = component.type == MessageComponentType::Code ? QTextDocumentFragment::fromPlainText(component.display)
: QTextDocumentFragment::fromHtml(component.display);
textItemWrapper->setInitialFragment(initialFragment);
textItemWrapper->setRoom(m_room);
textItemWrapper->setType(m_type);
if (component.type == MessageComponentType::Quote) {
textItemWrapper->setFixedChars(u"\""_s, u"\""_s);
}
component.attributes.insert(TextItemKey, QVariant::fromValue<ChatTextItemHelper *>(textItemWrapper));
connectTextItem(textItemWrapper);
}
m_components += component;
});
endResetModel();
}
ChatBarType::Type ChatBarMessageContentModel::type() const
{
return m_type;

View File

@@ -130,10 +130,12 @@ Q_SIGNALS:
private:
ChatBarType::Type m_type = ChatBarType::None;
std::optional<ChatBarType::Type> unhandledTypeChange = std::nullopt;
void connectCache(ChatBarCache *oldCache = nullptr);
void initializeModel(const QString &initialText = {});
void initializeFromCache();
void initializeEdit();
std::optional<QString> getReplyEventId() override;