Compare commits

...

386 Commits

Author SHA1 Message Date
Michele Guerini Rocco a5ecc34cae
hide useless buttons 2023-02-26 19:25:28 +01:00
Michele Guerini Rocco 607a2bf9ec
remove rounded shapes 2023-02-26 19:25:28 +01:00
Michele Guerini Rocco 144ce3dd81
tweak chat components 2023-02-26 19:25:28 +01:00
Michele Guerini Rocco 588ab67320
tweak quick switcher 2023-02-26 19:25:27 +01:00
Michele Guerini Rocco da519d0822
tweak colors 2023-02-26 19:25:27 +01:00
Michele Guerini Rocco 595b480002
add dawn theme 2023-02-26 19:25:27 +01:00
Michele Guerini Rocco d9c8f67f99
workaround for QTBUG-82607 2023-02-25 12:23:14 +01:00
Michele Guerini Rocco f978a3287c
make avatar smaller in timeline 2023-02-25 12:23:14 +01:00
Michele Guerini Rocco b87c2c71c2
fix double nheko/nheko directory 2023-02-25 12:23:14 +01:00
Michele Guerini Rocco 4e6f736f13
add nix expression 2023-02-25 12:23:00 +01:00
Nicolas Werner d27e42dec6
Hotfix redundant null terminator inserted by emoji completer 2023-02-23 00:50:45 +01:00
Nicolas Werner 17ad97c517
Fix typo in tag 2023-02-20 02:45:06 +01:00
Nicolas Werner 011c3ac8ec
Amend changelog 2023-02-20 02:36:18 +01:00
Nicolas Werner 7284b20643
Bump version 2023-02-20 02:34:29 +01:00
Nicolas Werner 0e5b367a3c
Update README 2023-02-20 02:28:47 +01:00
Nicolas Werner b52527b4ca
Mention qt5 image formats in FAQ
fixes #1213
2023-02-20 01:23:22 +01:00
Nicolas Werner d9dd4a3934
Fix forwarding stickers
fixes #1182
2023-02-20 01:18:06 +01:00
Nicolas Werner ac4c9e024e
More template bloat reduction 2023-02-20 01:04:49 +01:00
Nicolas Werner a1c4889339
Remove a few more unused symbols 2023-02-19 23:17:21 +01:00
Nicolas Werner ae7bb333a1
Fix flatpak bundle upload 2023-02-19 22:33:02 +01:00
Nicolas Werner 7833566cdb
Fix gcc10 again. Remove this once we stop supporting gcc10 2023-02-19 22:33:02 +01:00
Nicolas Werner e9f4298418
Fix gcc10 compat 2023-02-19 21:54:45 +01:00
Nicolas Werner 920409e914
Reduce code bloat a bit
Especially the emoji array shrinks a lot with this, but adds a few extra
relocations on startup. But it removes a lot of exception handling code
at runtime, which is nice and possibly this is still faster.
2023-02-19 21:38:28 +01:00
Nicolas Werner 20740c9976
Automatically fetch keys for undecrypted messages after verification
Also fix rerendering edited messages after keys are received.

fixes #1375
fixes #770
fixes #888
2023-02-18 03:08:23 +01:00
Nicolas Werner 05727b8a45
Fix edits in other clients jumping out of threads
fixes #1373
2023-02-18 01:33:10 +01:00
DeepBlueV7.X 2a380eeae6
Merge pull request #1376 from xvitaly/blurhash
Added ability to build with packaged version of blurhash
2023-02-17 21:22:45 +01:00
Vitaly Zaitsev 1831819e67
Added ability to build with packaged version of blurhash.
Signed-off-by: Vitaly Zaitsev <vitaly@easycoding.org>
2023-02-16 15:26:02 +01:00
Nicolas Werner 5457d67c98
Explicitly set parent for scrollbars to prevent them from showing on some platforms 2023-02-16 00:39:47 +01:00
Nicolas Werner 60606133cb
Fix build on macOS 2023-02-15 23:44:50 +01:00
DeepBlueV7.X 59b5df479e
Merge pull request #1371 from xvitaly/httplib
Added ability to build with packaged version of cpp-httplib
2023-02-15 20:15:50 +01:00
Weblate 0e64ccca02 Translated using Weblate (Estonian)
Currently translated at 100.0% (942 of 942 strings)

Co-authored-by: Priit Jõerüüt <nhkwlate@joeruut.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/et/
Translation: Nheko/nheko
2023-02-15 11:17:54 +00:00
Vitaly Zaitsev c432cf4909
Added ability to build with packaged version of cpp-httplib.
Signed-off-by: Vitaly Zaitsev <vitaly@easycoding.org>
2023-02-15 10:36:56 +01:00
Nicolas Werner 2f23a7d86f
Fix linting 2023-02-14 22:06:33 +01:00
Nicolas Werner 58f5ba5023
Make scrollbars optional and disabled by default
Also add them to the communities sidebar
2023-02-14 22:01:00 +01:00
Alexander Bantyev ac19c6c92b
Room list: add scrollbar when not collapsed 2023-02-14 22:01:00 +01:00
DeepBlueV7.X 316eb07dbf
Merge pull request #1366 from Nheko-Reborn/uiTweaks
Focus text input when quick switcher is closed
2023-02-14 20:42:36 +01:00
Weblate bbaa4b58d0 Translated using Weblate (German)
Currently translated at 100.0% (940 of 940 strings)

Co-authored-by: DeepBlueV7.X <nicolas.werner@hotmail.de>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/de/
Translation: Nheko/nheko
2023-02-14 19:31:04 +00:00
Nicolas Werner c0fa7330a2
Update translations 2023-02-14 18:58:29 +01:00
Loren Burkholder 9297035ba8 Focus text input when quick switcher is closed
Fixes #1065
2023-02-14 12:58:28 -05:00
DeepBlueV7.X 009d1a8e2d
Merge pull request #1359 from Nheko-Reborn/encryption_delegate
Add a fancy delegate when encryption is enabled
2023-02-14 18:54:43 +01:00
Loren Burkholder 92d9539824
Update resources/qml/delegates/EncryptionEnabled.qml
Co-authored-by: DeepBlueV7.X <nicolas.werner@hotmail.de>
2023-02-14 12:44:26 -05:00
DeepBlueV7.X 2a28b3a343
Merge pull request #1365 from Nheko-Reborn/video_improvements
Video player improvements
2023-02-14 18:25:23 +01:00
Weblate b7b9b00c7f Translated using Weblate (Ukrainian)
Currently translated at 40.4% (380 of 939 strings)

Co-authored-by: NullPointerException <kigen745@gmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/uk/
Translation: Nheko/nheko
2023-02-14 16:37:14 +00:00
Loren Burkholder 905b127a73 Add a generic video icon when there is no thumbnail 2023-02-14 09:16:00 -05:00
Loren Burkholder 787febdca2 Pause video when switching rooms
Fixes #809
2023-02-14 09:15:56 -05:00
Loren Burkholder 1f8777178e Limit max width of blurb 2023-02-13 20:46:53 -05:00
Loren Burkholder 707af2c11d Update message 2023-02-13 20:46:53 -05:00
Loren Burkholder 902d4a7eb2 Add a fancy delegate when encryption is enabled 2023-02-13 20:46:53 -05:00
Weblate ec9eb812f5 Translated using Weblate (Indonesian)
Currently translated at 100.0% (939 of 939 strings)

Co-authored-by: Linerly <linerly@protonmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/id/
Translation: Nheko/nheko
2023-02-13 13:18:39 +00:00
Weblate e56c020f84 Translated using Weblate (Estonian)
Currently translated at 100.0% (939 of 939 strings)

Co-authored-by: Priit Jõerüüt <nhkwlate@joeruut.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/et/
Translation: Nheko/nheko
2023-02-12 11:26:32 +00:00
Weblate 8e0db5e10e Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (939 of 939 strings)

Co-authored-by: Poesty Li <poesty7450@gmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/zh_Hans/
Translation: Nheko/nheko
2023-02-12 04:36:57 +00:00
Weblate 718965fa9b Translated using Weblate (Esperanto)
Currently translated at 100.0% (939 of 939 strings)

Co-authored-by: Tirifto <tirifto@posteo.cz>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/eo/
Translation: Nheko/nheko
2023-02-12 04:36:57 +00:00
DeepBlueV7.X dedc3cb1f8
Merge pull request #914 from Thulinma/imageOverlayRoleQml
Make ImageOverlay set appropriate windowRole again
2023-02-11 20:06:57 +00:00
Nicolas Werner b2175d044f
Remove some commands from the translations 2023-02-11 12:34:26 +01:00
Weblate 0c8c1c24f0 Translated using Weblate (Finnish)
Currently translated at 95.6% (906 of 947 strings)

Co-authored-by: DeepBlueV7.X <nicolas.werner@hotmail.de>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/fi/
Translation: Nheko/nheko
2023-02-11 11:33:52 +00:00
Weblate 74fe6d006c Translated using Weblate (French)
Currently translated at 69.3% (657 of 947 strings)

Co-authored-by: Mayeul Cantan <mayeul.cantan@gmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/fr/
Translation: Nheko/nheko
2023-02-11 11:33:52 +00:00
Weblate 57c418d7e5 Translated using Weblate (French)
Currently translated at 69.1% (655 of 947 strings)

Translated using Weblate (French)

Currently translated at 69.1% (655 of 947 strings)

Co-authored-by: CB <chb0@lavache.com>
Co-authored-by: Mayeul Cantan <mayeul.cantan@gmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/fr/
Translation: Nheko/nheko
2023-02-11 11:27:21 +00:00
Weblate 5756cf299e Translated using Weblate (French)
Currently translated at 68.2% (646 of 947 strings)

Translated using Weblate (French)

Currently translated at 68.2% (646 of 947 strings)

Co-authored-by: CB <chb0@lavache.com>
Co-authored-by: Mayeul Cantan <mayeul.cantan@gmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/fr/
Translation: Nheko/nheko
2023-02-11 11:21:01 +00:00
Weblate e9ed96d522 Translated using Weblate (French)
Currently translated at 68.0% (644 of 947 strings)

Translated using Weblate (French)

Currently translated at 68.0% (644 of 947 strings)

Co-authored-by: CB <chb0@lavache.com>
Co-authored-by: Glandos <bugs-github@antipoul.fr>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/fr/
Translation: Nheko/nheko
2023-02-11 11:20:06 +00:00
Nicolas Werner 3dc1802130
Update translations 2023-02-11 12:06:26 +01:00
phyto 4481b2518b
Standardise command format messages 2023-02-11 10:48:11 +01:00
Thulinma 7ffae002a5 Make ImageOverlay set appropriate windowRole again 2023-02-10 18:01:47 +01:00
Weblate 5483c35452 Translated using Weblate (Estonian)
Currently translated at 100.0% (947 of 947 strings)

Co-authored-by: Priit Jõerüüt <nhkwlate@joeruut.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/et/
Translation: Nheko/nheko
2023-02-10 16:03:59 +00:00
Weblate 17127a08ac Translated using Weblate (Dutch)
Currently translated at 100.0% (947 of 947 strings)

Co-authored-by: Jaron Viëtor <jaron@v8or.nl>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/nl/
Translation: Nheko/nheko
2023-02-10 16:03:58 +00:00
Weblate e16048fc10 Translated using Weblate (Esperanto)
Currently translated at 100.0% (947 of 947 strings)

Co-authored-by: Tirifto <tirifto@posteo.cz>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/eo/
Translation: Nheko/nheko
2023-02-10 16:03:58 +00:00
Weblate 1cac7fed0b Translated using Weblate (Italian)
Currently translated at 20.0% (188 of 940 strings)

Translated using Weblate (Italian)

Currently translated at 20.0% (188 of 940 strings)

Translated using Weblate (Italian)

Currently translated at 20.0% (188 of 940 strings)

Translated using Weblate (Italian)

Currently translated at 20.0% (188 of 940 strings)

Co-authored-by: DynamoFox <magnacacuti@gmail.com>
Co-authored-by: Elia Tomasi <elia.tomasi@pm.me>
Co-authored-by: Joseph Curto <joe@joe.vr.it>
Co-authored-by: Quanterxotur <ganno.lexis.ag@mailbox.org>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/it/
Translation: Nheko/nheko
2023-02-10 16:03:58 +00:00
Weblate 160f740fbc Translated using Weblate (Indonesian)
Currently translated at 99.8% (946 of 947 strings)

Co-authored-by: Linerly <linerly@protonmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/id/
Translation: Nheko/nheko
2023-02-10 16:03:58 +00:00
Nicolas Werner a0fe13127d
Update translations 2023-02-08 22:45:09 +01:00
Nicolas Werner 36e5ef1a1f
Fix build without voip 2023-02-08 21:22:15 +01:00
Joseph Donofry 720e7fceec Fix empty list freeze in Completer 2023-02-08 14:19:35 -05:00
Nicolas Werner fc7937c73d
Fix required plugin check on gstreamer 1.22
GStreamer 1.22 merged the videoscale plugin into the videoconvertscale
plugin. So we should check if the Element is still loadable instead of
checking the plugin name.

fixes #1352
2023-02-08 00:54:02 +01:00
Nicolas Werner 50f5fc6637
Use more modern flatpak build features 2023-02-06 22:56:14 +01:00
Nicolas Werner ad4ea02547
Add a reduced motion option
fixes #1350
2023-02-06 13:56:23 +01:00
Nicolas Werner 0ab566dc4b
lint and avoid copy 2023-02-02 01:26:42 +01:00
Nicolas Werner a320fc6f7a
lint 2023-02-02 01:21:23 +01:00
DeepBlueV7.X 539db70fd5
Merge pull request #1341 from Decodetalkers/ft_clean_notify
clean all notifications if exit on linux
2023-02-02 01:07:16 +01:00
DeepBlueV7.X 17331fcf83
Merge pull request #1347 from mauke/url-regex-war-crime
Allow nested ()/[] brackets in URLs (fixes #1346)
2023-02-02 00:59:18 +01:00
Lukas Mai b9517e588b Allow nested ()/[] brackets in URLs (fixes #1346) 2023-02-01 21:14:14 +01:00
Nicolas Werner 7734c4735a
Make notifications show the window again
fixes #1329
2023-02-01 18:24:25 +01:00
ShootingStarDragons 0e2cc65548 chore: Adjust about function closeAllNotification
Log: maek closeAllNotification on all platform, move
closeAllNotification action to aboutToQuit
2023-02-01 09:58:46 +08:00
Nicolas Werner 673ca9d6a3
spoiler -> +warning 2023-01-31 22:08:00 +01:00
tastytea 1b00696bcc
document /cmark and Markdown extensions in man page (#1344)
* document /cmark in man page

* document Markdown extension in man page

* fix spoiler wording

Co-authored-by: DeepBlueV7.X <nicolas.werner@hotmail.de>

---------

Co-authored-by: DeepBlueV7.X <nicolas.werner@hotmail.de>
2023-01-31 21:01:50 +00:00
Nicolas Werner ee5b33978a
Optimize user model construction by 2.5x 2023-01-31 21:05:23 +01:00
DeepBlueV7.X 8c06460e91
Merge pull request #1345 from q234rty/master
Fix some leftover menus from #1319
2023-01-31 19:54:26 +01:00
q234rty fa3ea18dcd
Fix some leftover menus from #1319 2023-02-01 02:34:26 +08:00
Nicolas Werner 0c3d46795b
Make single newlines cause a <br> by default
This should match what people expect from a chat application much
better. The biggest reason not to do this, is because some people might
paste markdown documents. For those people there is now a /cmark
command, which disables most of our extensions to cmark, including the
newline behaviour. There is a long discussion on the Fediverse and on
Github linked below.

Mastodon https://fosstodon.org/@deepbluev7/109771668066978726
fixes #757
2023-01-31 18:22:12 +01:00
Nicolas Werner 9f529075f0
Uncoditionally request keyframes 2023-01-31 18:02:35 +01:00
Malte E 5ed3bfc8f8
add user search to invite dialog (#1253) 2023-01-31 16:59:49 +00:00
ShootingStarDragons 919ec2a5e3 feat: clean all notifications if exit on linux 2023-01-29 13:46:00 +08:00
DeepBlueV7.X 3abb49c4a2
Merge pull request #1319 from Decodetalkers/menuhideonwayland
feat: hide all popup menus when press leftbutton on somewhere else
2023-01-28 12:15:54 +01:00
Nicolas Werner 872b00807f
Make newline behave consistently in markdown mode
by always sending as formatted when a newline is in the body
2023-01-28 10:50:39 +01:00
Nicolas Werner ec3ba352c0
Support strikethrough via ~~ 2023-01-28 10:36:47 +01:00
ShootingStarDragons e84e2b0aaa chore: remove button check 2023-01-28 17:10:45 +08:00
Nicolas Werner 47e3257963
Get rid of shadowing even if the shadowing there is probably the safer solution 2023-01-28 09:04:36 +01:00
Nicolas Werner 60b1a595e1
Support simplified spoiler input using || tags
relates to #1231
2023-01-28 08:51:33 +01:00
Weblate 7c8bb14f22 Translated using Weblate (Ukrainian)
Currently translated at 33.6% (316 of 940 strings)

Co-authored-by: NullPointerException <kigen745@gmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/uk/
Translation: Nheko/nheko
2023-01-27 18:36:42 +00:00
Weblate 13163699bc Translated using Weblate (Ukrainian)
Currently translated at 28.1% (265 of 940 strings)

Co-authored-by: NullPointerException <kigen745@gmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/uk/
Translation: Nheko/nheko
2023-01-27 17:46:31 +00:00
Weblate 0e4c0c4949 Translated using Weblate (Ukrainian)
Currently translated at 28.0% (264 of 940 strings)

Co-authored-by: NullPointerException <kigen745@gmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/uk/
Translation: Nheko/nheko
2023-01-27 17:35:51 +00:00
Weblate 181ea3850e Translated using Weblate (Ukrainian)
Currently translated at 27.2% (256 of 940 strings)

Co-authored-by: Priit Jõerüüt <nhkwlate@joeruut.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/uk/
Translation: Nheko/nheko
2023-01-27 15:28:30 +00:00
Weblate edba6ad91f Translated using Weblate (Estonian)
Currently translated at 100.0% (940 of 940 strings)

Co-authored-by: Priit Jõerüüt <nhkwlate@joeruut.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/et/
Translation: Nheko/nheko
2023-01-27 15:28:30 +00:00
Nicolas Werner 213bcf0de6
Fix br tags 2023-01-27 14:03:54 +01:00
ShootingStarDragons c893dfd102 chore: limit it to linux wayland 2023-01-26 20:34:38 +08:00
Weblate 68bf9c0bfa Translated using Weblate (French)
Currently translated at 68.5% (644 of 940 strings)

Translated using Weblate (French)

Currently translated at 68.5% (644 of 940 strings)

Co-authored-by: CB <chb0@lavache.com>
Co-authored-by: Rick M. G <rick@gnous.eu>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/fr/
Translation: Nheko/nheko
2023-01-24 19:22:10 +00:00
DeepBlueV7.X f6b976b415
Merge pull request #1299 from enigma9o7/patch-1
Merge Debian/Ubuntu Dependencies
2023-01-24 06:36:38 +01:00
Joseph Donofry d511814caf Fix free-ing invalid pointer in call devices. From Jason Volk <jason@zemos.net> 2023-01-23 16:34:24 -05:00
enigma9o7 3f846fbdba
remove unneeded font tags 2023-01-23 09:33:46 -08:00
ShootingStarDragons 7d95ac23ce feat: hide all popup menus when press leftbutton on somewhere else
Log: according to the bug on https://bugreports.qt.io/browse/QTBUG-83972, The menu will always stay if not click one of the item. So I try to make a hack for it, wait qt solve it someday
2023-01-23 20:15:43 +08:00
DeepBlueV7.X d59f0768f0
Merge pull request #1317 from tastytea/fix-zsh-completion
update Zsh completion
2023-01-22 23:29:49 +01:00
tastytea b17cc41645
update Zsh completion
- add new command line switches
- prevent duplication in argument descriptions
- load helper function before using it (fixes error with Zsh 5.9)
2023-01-22 23:22:01 +01:00
Nicolas Werner 15d7a2f021
Make code tags preserve whitespace 2023-01-22 17:36:23 +01:00
Nicolas Werner 1d8fc18304
Warn when no secret can be requested 2023-01-22 05:31:33 +01:00
Jason Volk 0253aa59c7
Skip empty requests for cross-signing keys when user only has one device.
Cause: Request button pressed in user settings.

Result: Request body is jsNull; sendToDevice requires jsObject.
2023-01-22 05:26:10 +01:00
Nicolas Werner 7f9af9016d
Fix a few minor leaks (or just memory showing up as not freed in tools) 2023-01-22 05:02:10 +01:00
DeepBlueV7.X 2157ebb614
Merge pull request #1304 from Decodetalkers/imagesave
chore: when save file, hide ImageOverlay window
2023-01-22 00:54:44 +01:00
Nicolas Werner 47da48f6f2
Fix creating DMs from pasting an mxid 2023-01-21 21:02:46 +01:00
Nicolas Werner 4c34f4bfee
Work around multiple destructor calls after consteval construction in full expression
I have no idea, if this is our fault or not, but Jason traced it back to
the consteval on the {fmt} format string constructor.

Specifically when a consteval constructor call happens in the statement,
the destructor call is moved to the end of the block. Inside the switch
statement that means, the destructor is called multiple times, which
corrupts the use count and crashes Nheko because of a double free.

I am assuming this is a bug in clang, but this will need to be
investigated more.

fixes #1292
2023-01-21 20:45:32 +01:00
ShootingStarDragons abe4f8eb3c chore: when save file, hide ImageOverlay window
Log: on wm like sway, it will cover the whole screen, and I cannot get
the file save dialog, then the program will stay there, I must kill it,
so I think hide it is better, because after, it will be closed
2023-01-20 22:10:22 +08:00
Weblate b4c0581948 Translated using Weblate (Russian)
Currently translated at 32.9% (310 of 940 strings)

Translated using Weblate (Russian)

Currently translated at 32.9% (310 of 940 strings)

Co-authored-by: Evgeny <mister.lameni@yandex.ru>
Co-authored-by: SOT-TECH <sblazhko@sot-te.ch>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/ru/
Translation: Nheko/nheko
2023-01-20 10:59:42 +00:00
Weblate b1439ac8ae Translated using Weblate (Finnish)
Currently translated at 96.4% (907 of 940 strings)

Co-authored-by: Lurkki14 <jussi.kuokkanen@protonmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/fi/
Translation: Nheko/nheko
2023-01-20 10:59:42 +00:00
Weblate 24f09ed426 Translated using Weblate (Estonian)
Currently translated at 97.7% (919 of 940 strings)

Co-authored-by: Priit Jõerüüt <nhkwlate@joeruut.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/et/
Translation: Nheko/nheko
2023-01-20 10:59:42 +00:00
Nicolas Werner c98231bac1
Make it more obvious that the add reaction button is not an emoji
fixes #1301
2023-01-19 06:51:51 +01:00
Nicolas Werner 33e9c80c1b
Fix html in sidebar again 2023-01-18 19:20:32 +01:00
Nicolas Werner bbb551f222
Try building only the qml gstreamer plugin in flatpak package 2023-01-18 06:43:43 +01:00
enigma9o7 4f7bb8fa8c
Merge Debian/Ubuntu Dependencies
Debian 10 too old for QT5.  Ubuntu dependencies tested and work fine on Debian.
Increase header size of distro title & moved Gentoo into alphabetical order
2023-01-17 16:13:09 -08:00
Joseph Donofry 05bfc2893f Errata 2023-01-16 08:21:19 -05:00
tastytea 02b900f86b
update Ubuntu dependency list for building from source (#1294)
tested in a fresh 22.04 VM today
2023-01-15 19:05:50 -05:00
Joseph Donofry c13a9d3b16 v0.11.1 2023-01-15 18:55:32 -05:00
squid-f e6f87882f3
Update README.md (#1287)
Add instruction to install on Mageia, as Nheko is now part of the official repo of the distribution.
2023-01-15 00:39:21 -05:00
Weblate cec9584f80 Translated using Weblate (Finnish)
Currently translated at 94.2% (886 of 940 strings)

Co-authored-by: Lurkki14 <jussi.kuokkanen@protonmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/fi/
Translation: Nheko/nheko
2023-01-14 21:19:20 +00:00
Weblate d45a084ffb Translated using Weblate (Portuguese (Portugal))
Currently translated at 48.9% (460 of 940 strings)

Co-authored-by: Tmpod <tmpod@pm.me>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/pt_PT/
Translation: Nheko/nheko
2023-01-14 21:19:20 +00:00
Joseph Donofry 8835040db6
Pause ParticleEmitter when not in use (#1284)
* Pause ParticleEmitter when not in use

* Use timer instead to pause particle system
2023-01-14 02:23:07 +01:00
Weblate e25fd5f4fc Translated using Weblate (Japanese)
Currently translated at 9.3% (88 of 940 strings)

Translated using Weblate (Japanese)

Currently translated at 9.3% (88 of 940 strings)

Co-authored-by: kyoberry <kyo@tilde.pink>
Co-authored-by: srr24x7 <sven.r.richter@protonmail.ch>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/ja/
Translation: Nheko/nheko
2023-01-13 16:45:44 +00:00
Weblate 05e06f84ec Translated using Weblate (German)
Currently translated at 100.0% (940 of 940 strings)

Co-authored-by: 123 <fof300f@posteo.net>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/de/
Translation: Nheko/nheko
2023-01-13 16:45:44 +00:00
Weblate 698030be62 Translated using Weblate (Finnish)
Currently translated at 94.1% (885 of 940 strings)

Co-authored-by: Lurkki14 <jussi.kuokkanen@protonmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/fi/
Translation: Nheko/nheko
2023-01-13 16:45:44 +00:00
Nicolas Werner c32081727a
Add missing translations to README 2023-01-13 01:17:44 +01:00
Nicolas Werner aff6ee3844
Remove dead code 2023-01-12 23:53:22 +01:00
Nicolas Werner ba56c9f408
There was always supposed to be a failed state for events 2023-01-12 23:51:22 +01:00
Nicolas Werner 3507698ea5
v0.11.0 2023-01-12 22:06:30 +01:00
Nicolas Werner 0c6a2fb706
Fix white bar above sticker picker 2023-01-12 22:06:30 +01:00
Weblate c38c4b47c8 Translated using Weblate (Esperanto)
Currently translated at 100.0% (940 of 940 strings)

Co-authored-by: Tirifto <tirifto@posteo.cz>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/eo/
Translation: Nheko/nheko
2023-01-12 19:27:06 +00:00
Nicolas Werner 239cfd6735
Fix weirdly big spinner 2023-01-12 20:26:35 +01:00
Nicolas Werner 9b8eb0a412
Fix white bar above emoji picker 2023-01-12 20:13:08 +01:00
Nicolas Werner 9877ba525d
Update changelog 2023-01-12 19:57:45 +01:00
Nicolas Werner 2345faf630
Try to fix binding loop in emoji picker 2023-01-12 07:34:17 +01:00
Nicolas Werner d6c7a2e0ce
Update changelog for 0.11.0 2023-01-12 05:39:55 +01:00
Weblate 067fb67a8e Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (940 of 940 strings)

Co-authored-by: ling <xll520yzl@gmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/zh_Hans/
Translation: Nheko/nheko
2023-01-12 04:02:50 +00:00
Nicolas Werner 8a619d2fea
Bump mtxclient version 2023-01-12 03:03:55 +01:00
Nicolas Werner 0833b39781
Log registration flows 2023-01-12 03:02:24 +01:00
Joseph Donofry a90b46026b Update translations from weblate, fix conflicts 2023-01-10 00:32:56 -05:00
NullPointerException 2382c17b67 Translated using Weblate (Ukrainian)
Currently translated at 25.5% (240 of 940 strings)

Translation: Nheko/nheko
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/uk/
2023-01-10 05:26:12 +00:00
Linerly ba0c489264 Translated using Weblate (Indonesian)
Currently translated at 100.0% (940 of 940 strings)

Translation: Nheko/nheko
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/id/
2023-01-10 05:26:11 +00:00
Terry Cukerberg 2b3685a2e6 Translated using Weblate (Portuguese (Brazil))
Currently translated at 7.9% (75 of 940 strings)

Translation: Nheko/nheko
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/pt_BR/
2023-01-10 05:26:11 +00:00
Daimar Stein 4c3a999aca Translated using Weblate (Portuguese (Brazil))
Currently translated at 7.9% (75 of 940 strings)

Translation: Nheko/nheko
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/pt_BR/
2023-01-10 05:26:11 +00:00
zerowhy 3af285a221 Translated using Weblate (Portuguese (Brazil))
Currently translated at 7.9% (75 of 940 strings)

Translation: Nheko/nheko
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/pt_BR/
2023-01-10 05:26:11 +00:00
Tirifto d4e7528ccf Translated using Weblate (Esperanto)
Currently translated at 99.4% (935 of 940 strings)

Translation: Nheko/nheko
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/eo/
2023-01-10 05:26:10 +00:00
Priit Jõerüüt 6c3af648d2 Translated using Weblate (Estonian)
Currently translated at 89.3% (840 of 940 strings)

Translation: Nheko/nheko
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/et/
2023-01-10 05:26:10 +00:00
Lurkki14 a9c0ba08df Translated using Weblate (Finnish)
Currently translated at 91.8% (863 of 940 strings)

Translation: Nheko/nheko
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/fi/
2023-01-10 05:26:10 +00:00
Chen Shaoju fa69c1a901 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (940 of 940 strings)

Translation: Nheko/nheko
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/zh_Hans/
2023-01-10 05:26:09 +00:00
Poesty Li d1d67734d7 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (940 of 940 strings)

Translation: Nheko/nheko
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/zh_Hans/
2023-01-10 05:26:09 +00:00
ling 316ba0a886 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (940 of 940 strings)

Translation: Nheko/nheko
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/zh_Hans/
2023-01-10 05:26:09 +00:00
SOT-TECH d8bce6d3e4 Translated using Weblate (Russian)
Currently translated at 32.6% (307 of 940 strings)

Translation: Nheko/nheko
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/ru/
2023-01-10 05:26:09 +00:00
Przemysław Romanik ee68e967d9 Translated using Weblate (Polish)
Currently translated at 93.2% (877 of 940 strings)

Translation: Nheko/nheko
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/pl/
2023-01-10 05:26:08 +00:00
Jaron Viëtor 537892981d Translated using Weblate (Dutch)
Currently translated at 100.0% (940 of 940 strings)

Translation: Nheko/nheko
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/nl/
2023-01-10 05:26:08 +00:00
Nicolas Werner 2ca5f87cdf
Update supported Matrix version 2023-01-10 05:54:58 +01:00
Nicolas Werner 22495cd86a
Properly regenerate emoji using regional indicators
fixes #1245
closes #1246
2023-01-10 05:46:14 +01:00
Nicolas Werner c5edd21e6b
Try to make clang-format happy 2023-01-09 05:00:22 +01:00
Nicolas Werner 008f71cdbd
Document Safari workaround 2023-01-09 04:53:14 +01:00
Nicolas Werner 6d8dabf623
Possibly fix paste from Safari 2023-01-09 04:49:53 +01:00
Nicolas Werner b84bc7895e
Add some more error logging 2023-01-09 02:06:49 +01:00
Nicolas Werner 1d4b5e40a3
Make server connection errors more useful 2023-01-09 01:55:33 +01:00
Nicolas Werner 0b8709a0ea
Fix potential crash from the room directory 2023-01-08 02:32:40 +01:00
Nicolas Werner fd949f0b83
Speedup quick switcher 2023-01-07 17:39:32 +01:00
Nicolas Werner 82e5fa1b45
Fix clear button styling 2023-01-07 03:43:39 +01:00
Nicolas Werner 7f6c1136ff
Fix html in usernames 2023-01-07 02:03:04 +01:00
Nicolas Werner b2ccf766ba
Navigate to space when room is selected
fixes #1260
2023-01-07 01:39:08 +01:00
Nicolas Werner f3b7919a53
Fix crash in migrations during secrets deletion
We need to block the migrations returning until the migrations are done.

Fixes #1258
2023-01-07 01:09:36 +01:00
DeepBlueV7.X 8b6109815d
Merge pull request #1212 from ZhymabekRoman/master
Add AppImage build
2023-01-05 16:34:09 +00:00
DeepBlueV7.X 82376877af
Update .gitlab-ci.yml 2023-01-05 04:06:26 +00:00
Zhymabek Roman 5ba74a5d90
Update AppImageBuilder.yml
Co-authored-by: DeepBlueV7.X <nicolas.werner@hotmail.de>
2023-01-05 09:43:51 +06:00
Zhymabek Roman f7749d9f97
Try to fix blank screen in AppImage build 2023-01-05 09:37:34 +06:00
Zhymabek Roman a823dacfb5
Try to fix blank screen in AppImage build 2023-01-05 09:16:08 +06:00
Zhymabek Roman c91694c6b2
Fix stupid typo in AppImage 2023-01-05 08:46:00 +06:00
Zhymabek Roman 10e2426090
Fix appimage-builder package version query bug
See: https://github.com/AppImageCrafters/appimage-builder/issues/280
2023-01-05 06:51:46 +06:00
Nicolas Werner 06723a4736
Bump mtxclient version 2023-01-02 18:56:47 +01:00
Nicolas Werner 77d2e31ace
Maybe fix text selection in raw message dialog 2023-01-02 18:46:29 +01:00
Zhymabek Roman 59410a99ac
Merge branch 'master' into master 2023-01-02 21:59:29 +06:00
Nicolas Werner 3a6a905429
A whole new year full of excitement and possibilities! 2023-01-02 04:25:33 +01:00
Nicolas Werner 5f315d8a3c
Fix pagination after timeline clear 2023-01-02 04:21:26 +01:00
Nicolas Werner 6176ce7c2b
Limit build jobs on small systems 2022-12-29 03:48:43 +01:00
Nicolas Werner 34203b5349 Merge branch 'Windows_send_fix' into 'master'
Fix send message logic bug introduced with shift+enter setting

See merge request nheko-reborn/nheko!23
2022-12-29 00:08:05 +00:00
Joseph Donofry 69c11d4533 Fix send message logic bug introduced with shift+enter setting 2022-12-28 18:51:30 -05:00
Nicolas Werner 114fa0868a
Skip notifying for your own messages 2022-12-28 21:57:57 +01:00
Weblate 35673b5b52 Added translation using Weblate (Ukrainian)
Co-authored-by: NullPointerException <kigen745@gmail.com>
2022-12-28 20:25:41 +00:00
Nicolas Werner 79a2efd25a
Finish german translation 2022-12-28 20:49:42 +01:00
Nicolas Werner 9dfe2248d5
Some german translations 2022-12-28 18:42:23 +01:00
Nicolas Werner 5bf315687a
Update english translation properly 2022-12-28 17:39:03 +01:00
Nicolas Werner 2577c93bb6
Revert storing members in statesdb for now 2022-12-27 16:19:59 +01:00
Nicolas Werner 01915360b4
Fix state reset command 2022-12-27 16:15:49 +01:00
Nicolas Werner 6529240be8
Update flat-manager-client 2022-12-27 04:30:32 +01:00
Nicolas Werner f98b289ba2
Show invite reason in the UI (hidden by default) 2022-12-27 01:40:25 +01:00
Joseph Donofry c0b7963134 Update translations 2022-12-26 16:20:17 -05:00
Weblate d78187b405 Translated using Weblate (Chinese (Simplified))
Currently translated at 92.5% (791 of 855 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 92.5% (791 of 855 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 92.5% (791 of 855 strings)

Co-authored-by: Eric <alchemillatruth@purelymail.com>
Co-authored-by: Poesty Li <poesty7450@gmail.com>
Co-authored-by: ling <xll520yzl@gmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/zh_Hans/
Translation: Nheko/nheko
2022-12-20 17:18:02 -05:00
Joseph Donofry cc89a36f46 Fix formatting issues 2022-12-20 17:16:18 -05:00
Joseph Donofry a2e120a8a3 Add 'clear' button to search bar and implement search indicator via spinner 2022-12-20 16:34:55 -05:00
Nicolas Werner d4336b56d6
Make unfiltered messages hidden by default 2022-12-19 05:19:22 +01:00
Nicolas Werner 0597041d8e
Fix searching more past again 2022-12-19 03:47:30 +01:00
Nicolas Werner b314f41f6b
Fix searching past the end 2022-12-19 03:42:43 +01:00
Nicolas Werner 51cbe0f6d8
Add some documentation for how the background filtering works 2022-12-19 03:30:54 +01:00
Nicolas Werner 561085ef9d
Make searching incremental to allow some userinteraction still 2022-12-19 03:24:22 +01:00
Nicolas Werner 2a4eac04b9
Fix unread bar size 2022-12-18 05:57:40 +01:00
Nicolas Werner 2ac3be1a18
Fix weird QQC2 crash in alias dialog
Backtrace:

Thread 1 "nheko" received signal SIGSEGV, Segmentation fault.
containerWidget (w=w@entry=0x0) at /usr/src/debug/dev-qt/qtwidgets-5.15.7/qtbase-everywhere-src-5.15.7/src/widgets/styles/qstylesheetstyle.cpp:2467
2467        if (const QAbstractScrollArea *sa = qobject_cast<const QAbstractScrollArea *>(w->parentWidget())) {
(gdb) bt
 #0  containerWidget(QWidget const*) (w=w@entry=0x0) at /usr/src/debug/dev-qt/qtwidgets-5.15.7/qtbase-everywhere-src-5.15.7/src/widgets/styles/qstylesheetstyle.cpp:2467
 #1  0x00007ffff4aa0ad6 in QStyleSheetStyle::drawPrimitive(QStyle::PrimitiveElement, QStyleOption const*, QPainter*, QWidget const*) const (this=0x555559917900, pe=<optimized out>, opt=0x55555ea4b5c0, p=0x7fffffffcfd0, w=0x0) at /usr/src/debug/dev-qt/qtwidgets-5.15.7/qtbase-everywhere-src-5.15.7/src/widgets/styles/qstylesheetstyle.cpp:4452
 #2  0x00007fff61d4a86b in KQuickStyleItem::paint(QPainter*) (this=this@entry=0x55555ea4a1e0, painter=painter@entry=0x7fffffffcfd0) at /usr/src/debug/kde-frameworks/qqc2-desktop-style-5.101.0/qqc2-desktop-style-5.101.0/plugin/kquickstyleitem.cpp:1667
 #3  0x00007fff61d4b22a in KQuickStyleItem::updatePolish() (this=0x55555ea4a1e0) at /usr/src/debug/kde-frameworks/qqc2-desktop-style-5.101.0/qqc2-desktop-style-5.101.0/plugin/kquickstyleitem.cpp:1928
 #4  0x00007ffff57717c2 in QQuickWindowPrivate::polishItems() (this=0x55555ea2e760) at /usr/src/debug/dev-qt/qtdeclarative-5.15.7-r1/qtdeclarative-everywhere-src-5.15.7/src/quick/items/qquickwindow.cpp:393
 #5  0x00007ffff570f4ef in QSGThreadedRenderLoop::polishAndSync(QSGThreadedRenderLoop::Window*, bool) (this=this@entry=0x5555598eb770, w=w@entry=0x7fffe000aef0, inExpose=inExpose@entry=true) at /usr/src/debug/dev-qt/qtdeclarative-5.15.7-r1/qtdeclarative-everywhere-src-5.15.7/src/quick/scenegraph/qsgthreadedrenderloop.cpp:1576
 #6  0x00007ffff5710a8e in QSGThreadedRenderLoop::handleExposure(QQuickWindow*) (this=0x5555598eb770, window=<optimized out>) at /usr/src/debug/dev-qt/qtdeclarative-5.15.7-r1/qtdeclarative-everywhere-src-5.15.7/src/quick/scenegraph/qsgthreadedrenderloop.cpp:1374
 #7  0x00007ffff43d2b45 in QWindow::event(QEvent*) (this=0x7fffe0006eb0, ev=<optimized out>) at /usr/src/debug/dev-qt/qtgui-5.15.7-r1/qtbase-everywhere-src-5.15.7/src/gui/kernel/qwindow.cpp:2450
 #8  0x00007ffff49ee481 in QApplicationPrivate::notify_helper(QObject*, QEvent*) (this=<optimized out>, receiver=0x7fffe0006eb0, e=0x7fffffffd460) at /usr/src/debug/dev-qt/qtwidgets-5.15.7/qtbase-everywhere-src-5.15.7/src/widgets/kernel/qapplication.cpp:3637
 #9  0x00007ffff3e2d618 in QCoreApplication::notifyInternal2(QObject*, QEvent*) (receiver=0x7fffe0006eb0, event=0x7fffffffd460) at /usr/src/debug/dev-qt/qtcore-5.15.7/qtbase-everywhere-src-5.15.7/src/corelib/kernel/qcoreapplication.cpp:1064
 #10 0x00007ffff43c8368 in QGuiApplicationPrivate::processExposeEvent(QWindowSystemInterfacePrivate::ExposeEvent*) (e=0x55555f648b30) at /usr/src/debug/dev-qt/qtgui-5.15.7-r1/qtbase-everywhere-src-5.15.7/src/gui/kernel/qguiapplication.cpp:3261
 #11 0x00007ffff43a55ab in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) (flags=flags@entry=...) at /usr/src/debug/dev-qt/qtgui-5.15.7-r1/qtbase-everywhere-src-5.15.7/src/gui/kernel/qwindowsysteminterface.cpp:1169
 #12 0x00007fffef102622 in xcbSourceDispatch(GSource*, GSourceFunc, gpointer) (source=<optimized out>) at /usr/src/debug/dev-qt/qtgui-5.15.7-r1/qtbase-everywhere-src-5.15.7/src/plugins/platforms/xcb/qxcbeventdispatcher.cpp:105
 #13 0x00007ffff386d030 in g_main_context_dispatch () at /usr/lib64/libglib-2.0.so.0
 #14 0x00007ffff386d2d8 in  () at /usr/lib64/libglib-2.0.so.0
 #15 0x00007ffff386d36f in g_main_context_iteration () at /usr/lib64/libglib-2.0.so.0
 #16 0x00007ffff3e80e55 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (this=0x5555596a4770, flags=...) at /usr/src/debug/dev-qt/qtcore-5.15.7/qtbase-everywhere-src-5.15.7/src/corelib/kernel/qeventdispatcher_glib.cpp:423
 #17 0x00007ffff3e2c00b in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (this=this@entry=0x7fffffffd700, flags=..., flags@entry=...) at /usr/src/debug/dev-qt/qtcore-5.15.7/qtbase-everywhere-src-5.15.7/include/QtCore/../../src/corelib/global/qflags.h:69
 #18 0x00007ffff3e344ea in QCoreApplication::exec() () at /usr/src/debug/dev-qt/qtcore-5.15.7/qtbase-everywhere-src-5.15.7/include/QtCore/../../src/corelib/global/qflags.h:121
 #19 0x00005555594a5c43 in main(int, char**) (argc=2, argv=0x7fffffffdab8) at /home/nicolas/Dokumente/devel/open-source/nheko/src/main.cpp:401
(gdb) p w
$1 = (const QWidget *) 0x0
2022-12-17 05:50:44 +01:00
Nicolas Werner e8e475956b
Fix confetti in the sidebar 2022-12-17 01:11:19 +01:00
Nicolas Werner 1a9f7860d4
Fix sending confetti 2022-12-16 17:24:52 +01:00
Nicolas Werner 0d0c6187c0
Bump mtxclient version 2022-12-16 15:36:33 +01:00
Nicolas Werner 6762032c53
Fix copy and paste again 2022-12-14 19:04:08 +01:00
Nicolas Werner eefa6379f9
I don't see why this would have detached, but make clazy happy 2022-12-13 23:47:08 +01:00
Nicolas Werner 8730586cfd
Focus text field on key press (swallows first though...) 2022-12-13 18:09:34 +01:00
Nicolas Werner 593d08fd2e
Revert "Disable keyboard selection for text by default"
This reverts commit 0035c359ce.
2022-12-13 17:53:48 +01:00
Nicolas Werner 8356746ea4
Fix image cache pruning interval 2022-12-13 06:05:29 +01:00
Nicolas Werner 95d898e09d
Add cache pruning for old image files 2022-12-13 06:02:07 +01:00
Nicolas Werner 952827d629
Add a button to room the upgraded room in the timeline 2022-12-13 05:08:22 +01:00
Nicolas Werner 0035c359ce
Disable keyboard selection for text by default 2022-12-13 05:08:21 +01:00
Loren Burkholder fa0c14b846
confetti (#1243)
* 🎉 (confetti) message support.  Thanks @LorenDB !
2022-12-10 10:17:15 -05:00
Weblate c2eb2f7ad1 Translated using Weblate (French)
Currently translated at 75.0% (642 of 855 strings)

Translated using Weblate (French)

Currently translated at 75.0% (642 of 855 strings)

Translated using Weblate (French)

Currently translated at 75.0% (642 of 855 strings)

Co-authored-by: GitEz-code <aandrowindows@gmail.com>
Co-authored-by: Guillaume Girol <symphorien+github@xlumurb.eu>
Co-authored-by: lascapi <pascal.isman@keleo-solutions.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/fr/
Translation: Nheko/nheko
2022-12-09 23:08:14 -05:00
Nicolas Werner 40a7d58ce1
fix squish 2022-12-07 13:09:41 +01:00
Nicolas Werner 283d6361e8
Properly check for target room encryption 2022-12-07 12:47:03 +01:00
DeepBlueV7.X 575294971d
Merge pull request #1239 from q234rty/master
Fix more blurry icons under HiDPI
2022-12-05 19:53:34 +01:00
q234rty 93291abfdf
Fix downscale 2022-12-06 01:49:42 +08:00
q234rty 4b8709598b
Fix people icon blurriness 2022-12-06 01:48:06 +08:00
Nicolas Werner 59703d3c25
Implement MSC3664, pushrules for related events 2022-12-05 18:39:47 +01:00
Weblate ea5984a575 Translated using Weblate (Chinese (Simplified))
Currently translated at 90.0% (770 of 855 strings)

Co-authored-by: ling <xll520yzl@gmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/zh_Hans/
Translation: Nheko/nheko
2022-12-03 21:20:06 -05:00
Nicolas Werner f440b41195
Fix stack overflow when filtering timeline 2022-11-22 19:18:10 +01:00
Nicolas Werner 329b4310b3
Fix cmark warning 2022-11-20 04:30:42 +01:00
Nicolas Werner 5b929c9d1a
Enable http/3 support 2022-11-20 03:51:58 +01:00
Weblate 30bbfeaea6 Translated using Weblate (German)
Currently translated at 92.7% (793 of 855 strings)

Co-authored-by: fnetX (aka fralix) <github@fralix.ovh>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/de/
Translation: Nheko/nheko
2022-11-17 10:23:51 -05:00
Weblate 5f554aa5cc Translated using Weblate (Japanese)
Currently translated at 9.1% (78 of 855 strings)

Co-authored-by: Max Harmathy <harmathy@secure.mailbox.org>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/ja/
Translation: Nheko/nheko
2022-11-17 10:23:51 -05:00
Joseph Donofry 802ba78fea
Only play macOS notification sounds when pushrules dictate it 2022-11-15 19:04:38 -05:00
Nicolas Werner ed889c32fc
Change margins because people nagged me 2022-11-10 00:43:05 +01:00
Nicolas Werner 3576589ea7
Fix crash in slash completer 2022-11-09 16:38:17 +01:00
Nicolas Werner 485babba14
Implement a completer for commands
fixes #429
2022-11-09 04:59:06 +01:00
DeepBlueV7.X 0cc1c6eddc
Merge pull request #1224 from Nheko-Reborn/settingsfromroomlist
Get room settings from room list
2022-11-09 03:03:52 +01:00
Loren Burkholder fe02e0dd91 Add room settings in room list 2022-11-07 19:26:42 -05:00
Nicolas Werner 725b5e0383
Try to fix clang-tidy 2022-11-06 04:02:14 +01:00
Nicolas Werner 537fa437e2
Store secrets (apart from the pickle key) in the database 2022-11-06 03:36:56 +01:00
Nicolas Werner 1f77e1c810
Prompt before deleting the database 2022-11-06 01:06:41 +01:00
DeepBlueV7.X eb4994ea87
Merge pull request #1223 from Nheko-Reborn/dbusVersion
Bump micro version
2022-11-05 22:03:48 +01:00
Loren Burkholder b622604c47 Bump micro version 2022-11-05 16:38:12 -04:00
DeepBlueV7.X a81aaa182a
Merge pull request #1222 from Nheko-Reborn/dbusStatus
Add status message to D-Bus API
2022-11-05 18:32:17 +01:00
Loren Burkholder de3cdd590f Add status message to D-Bus API 2022-11-05 13:13:18 -04:00
DeepBlueV7.X 314785d05c
Merge pull request #1221 from LordMZTE/invert-enter
Add invert enter key setting
2022-11-04 23:54:14 +01:00
LordMZTE 9a15b0ea20
Move invert enter key setting 2022-11-04 23:53:36 +01:00
LordMZTE 80270e1f01
Add invert enter key setting 2022-11-04 23:42:35 +01:00
Joe Donofry a6f53699f5 Merge branch 'macos_notification_actions' into 'master'
Add ability to respond to notifications on macOS

See merge request nheko-reborn/nheko!21
2022-11-04 16:42:09 +00:00
Joe Donofry 07e8f64903 Add ability to respond to notifications on macOS 2022-11-04 16:42:09 +00:00
Nicolas Werner 76347f1c6f
Continue fetching past messages when searching 2022-11-03 23:26:59 +01:00
Nicolas Werner 56a4e97296
Make the higlight ring a bit less in your face 2022-11-03 14:45:00 +01:00
Nicolas Werner 0ae29d8bfc
Fix content rules matching everything
fixes #1218
2022-11-02 19:35:07 +01:00
Nicolas Werner 40ac55ddd9
Highlight higlight tweaks in the timeline
fixes #400
fixes #1136
2022-11-01 23:26:21 +01:00
Nicolas Werner 231bebba44
The hybris of committing a line without linting 2022-11-01 21:26:31 +01:00
Nicolas Werner 54931cb21b
Optimize fetching olm session from the db 2022-11-01 21:19:58 +01:00
Nicolas Werner 676a6506cb
Speedup sending encrypted messages after metasync was reenabled
Calling fsync everytime we save to the db is slow, which is actually
fairly noticeable in some larger E2EE rooms. Speed that up slightly by
batching the olm session persisting.
2022-11-01 20:58:01 +01:00
Nicolas Werner ee1a219661
Fix search rooms button 2022-11-01 15:11:58 +01:00
Weblate 53bbfefbab Translated using Weblate (Russian)
Currently translated at 33.0% (283 of 855 strings)

Translated using Weblate (Russian)

Currently translated at 33.0% (283 of 855 strings)

Translated using Weblate (Russian)

Currently translated at 33.0% (283 of 855 strings)

Co-authored-by: Carmina16 <mistresssilvara@hotmail.com>
Co-authored-by: Evgeny <mister.lameni@yandex.ru>
Co-authored-by: SOT-TECH <sblazhko@sot-te.ch>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/ru/
Translation: Nheko/nheko
2022-10-29 18:59:25 -04:00
Nicolas Werner 9138119dc4
Fix reactions matching displayname condition by accident 2022-10-28 19:35:06 +02:00
Joseph Donofry b92a3b8df5
Make sure we use qt5 macdeployqt 2022-10-28 10:13:41 -04:00
Nicolas Werner d8669ccf3d
Turn metasync and sync back on for the database to account for bad filesystems 2022-10-28 01:43:06 +02:00
Joseph Donofry 7f825e3ee8
Fix PLAT being wrong for m1 builds 2022-10-27 19:08:27 -04:00
Joseph Donofry c6c8ac092b
Fix conditional checks 2022-10-27 18:55:52 -04:00
Joe Donofry 1d477dfc65 Merge branch 'cirrus_ci_apple_silicon' into 'master'
See merge request nheko-reborn/nheko!22
2022-10-27 22:21:59 +00:00
Joe Donofry 35b18700ac Add support for Apple Silicon builds via Cirrus CI 2022-10-27 22:21:58 +00:00
Nicolas Werner 48ecc2b45a
fix blurry thumbnails 2022-10-27 22:53:21 +02:00
Nicolas Werner ac0f011221
Disable Wconversion again 2022-10-26 01:21:52 +02:00
Nicolas Werner 9a90f8868f
lint 2022-10-26 01:14:46 +02:00
Nicolas Werner b28fa86e6a
Enable -Wconversion 2022-10-26 01:10:35 +02:00
DeepBlueV7.X 5be8298d0a
Merge pull request #1215 from foxB612/fix-thumbnail-size
Fix UploadBox thumbnail size
2022-10-25 16:06:26 +00:00
Weblate 3109508e85 Translated using Weblate (Estonian)
Currently translated at 92.0% (787 of 855 strings)

Co-authored-by: Priit Jõerüüt <nhkwlate@joeruut.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/et/
Translation: Nheko/nheko
2022-10-24 23:22:15 -04:00
foxb612 f3ecef5cd7 Fix UploadBox thumbnail size 2022-10-25 03:22:12 +08:00
Zhymabek Roman eb845b2290
AppImage: reduce package size 2022-10-24 12:00:49 +06:00
Nicolas Werner ccd2465066
Fix windows build... 2022-10-24 01:13:51 +02:00
Zhymabek Roman 7cd45c16fd
AppImage: trying to reduce final AppImage size 2022-10-23 06:40:28 +06:00
Nicolas Werner e9a0f0a89e
Fix previews getting sorted above normal rooms 2022-10-22 21:39:29 +02:00
Zhymabek Roman 4636211b90
AppImage: use bundled libevent 2022-10-21 22:40:17 +06:00
Zhymabek Roman ef0ef4dbb2
AppImage: Use bundled OpenSSL 2022-10-21 10:34:21 +06:00
Zhymabek Roman 7747469825
Disable bundle some packages in AppImage 2022-10-21 09:43:21 +06:00
Zhymabek Roman 1f666acffc
Add AppImage recipe file 2022-10-20 10:08:01 +06:00
Zhymabek Roman 1ee37e026c
Add AppImage build 2022-10-20 10:02:46 +06:00
Nicolas Werner 74128cf8bd
Fix excessive summary calls 2022-10-20 01:01:18 +02:00
Nicolas Werner 1423011dd9
bump mtxclient to fix notification bug 2022-10-17 14:36:22 +02:00
Rohit Sutradhar ac48c33286
VoIP v1 implementation (#1161)
* Initial commit for VoIP v1 implementation

* Added draft of event handlers for voip methods

* Added event handlers for VoIP events, added rejectCall, added version tracking for call version for V0 and V1 compatibility

* Added call events to the general message pipeline. Modified Call Reject mechanism

* Added message delegates for new events. Modified hidden events. Updated handle events.

* Updated implementation to keep track of calls on other devices

* Fixed linting

* Fixed code warnings

* Fixed minor bugs

* fixed ci

* Added acceptNegotiation method definition when missing gstreamer

* Fixed warnings

* Fixed linting
2022-10-14 13:49:05 +00:00
Nicolas Werner 8a4bb32b4a
Add toggle to disable decrypting notifications 2022-10-13 18:19:46 +02:00
Nicolas Werner 37009906bb
Evaluate push rules locally 2022-10-13 17:55:07 +02:00
Nicolas Werner a1dd02d763
Bump mtxclient 2022-10-13 17:55:07 +02:00
Weblate 03fc88281d Translated using Weblate (Russian)
Currently translated at 30.5% (261 of 855 strings)

Translated using Weblate (Russian)

Currently translated at 30.5% (261 of 855 strings)

Translated using Weblate (Russian)

Currently translated at 30.5% (261 of 855 strings)

Co-authored-by: Carmina16 <mistresssilvara@hotmail.com>
Co-authored-by: Mihail Iosilevich <mihail.iosilevitch@yandex.ru>
Co-authored-by: SOT-TECH <sblazhko@sot-te.ch>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/ru/
Translation: Nheko/nheko
2022-10-12 12:29:48 -04:00
Weblate e2ea5650a2 Added translation using Weblate (Occidental)
Co-authored-by: Carmina16 <mistresssilvara@hotmail.com>
2022-10-12 08:12:37 -04:00
Weblate 32752df028 Translated using Weblate (Indonesian)
Currently translated at 100.0% (855 of 855 strings)

Co-authored-by: Linerly <linerly@protonmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/id/
Translation: Nheko/nheko
2022-10-12 02:45:25 -04:00
Nicolas Werner af699eb83e
Mark classes as final where possible 2022-10-10 14:38:45 +02:00
Weblate 00cc9a09a5 Translated using Weblate (Indonesian)
Currently translated at 99.8% (854 of 855 strings)

Co-authored-by: Linerly <linerly@protonmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/id/
Translation: Nheko/nheko
2022-10-09 09:05:18 -04:00
Nicolas Werner 4002b1ecf1
Properly propagate pack usage to UI
We can't have a pack that is neither sticker nor emoji. Which is why
none defaults to both on. That wasn't propagated to the UI, which made
the interaction very confusing. It also made some states unsettable,
since you can't turn anything off from the none state.

fixes #1152
2022-10-09 02:14:31 +02:00
Nicolas Werner 30fde1f8ac
Don't send avatars over dbus by default
This should reduce payload size a lot
2022-10-09 00:56:02 +02:00
Nicolas Werner 7e0ea12ebb
Update to unicode 15 and make script jinja:3 compatible 2022-10-08 00:27:57 +02:00
Nicolas Werner a4524cd9af
Fix date separator 2022-10-07 11:11:07 +02:00
Nicolas Werner f2f9359f7f
Add a shortcut for search 2022-10-07 10:04:08 +02:00
Nicolas Werner f1c1f18f81
Add a slow way to search a room 2022-10-06 22:02:26 +02:00
Nicolas Werner 857d9cf2b6
Basic thread filtering
The reply pagination logic is a bit weird rn though.
2022-10-06 16:16:24 +02:00
Weblate a87f1be688 Translated using Weblate (Finnish)
Currently translated at 100.0% (855 of 855 strings)

Co-authored-by: Lurkki14 <jussi.kuokkanen@protonmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/fi/
Translation: Nheko/nheko
2022-10-05 13:27:51 -04:00
Nicolas Werner aed1440d26
Don't let old server lookups overwrite new ones 2022-10-05 19:20:22 +02:00
Nicolas Werner d70a344a4d
Fix userprofile on roomlist 2022-10-05 17:25:01 +02:00
Nicolas Werner 005a4978bf
Update translations 2022-10-04 01:19:47 +02:00
Nicolas Werner b205819ba6
Swap thread and edit button 2022-10-04 00:38:59 +02:00
Nicolas Werner d8993c14e1
Fix raw message dialog 2022-10-04 00:36:57 +02:00
Loren Burkholder 8ecbb39dc6
cppcheck stuff (#1200)
* cppcheck stuff

* Update src/ui/RoomSettings.cpp

Co-authored-by: DeepBlueV7.X <nicolas.werner@hotmail.de>

* Update src/ui/RoomSettings.cpp

Co-authored-by: DeepBlueV7.X <nicolas.werner@hotmail.de>

* Fix linting

Co-authored-by: DeepBlueV7.X <nicolas.werner@hotmail.de>
2022-10-03 21:57:30 +00:00
DeepBlueV7.X 5e9eb845ab
Merge pull request #1202 from Nheko-Reborn/grammar
Grammar
2022-10-03 21:37:01 +00:00
Loren Burkholder e7d0344997
Fixed a crash in member list loading (#1199) 2022-10-03 21:26:32 +00:00
Nicolas Werner 33403d650a
Don't strip fallbacks on plain text bodies 2022-10-03 21:53:10 +02:00
DeepBlueV7.X cfcdc23d4a
Merge pull request #1201 from Nheko-Reborn/eoUpdates
Update some Esperanto translations
2022-10-03 11:23:34 +00:00
Nicolas Werner b3c5f41625
Fix a few more windows warnings 2022-10-02 12:31:03 +02:00
Nicolas Werner 1365e4e266
Try to fix qtjdenticon build in appveyor 2022-10-02 11:40:14 +02:00
Nicolas Werner a55fc8e43b
Work around MSVC bug with structured bindings in lambdas
Causes error messages like:
error C3493: 'key_id' cannot be implicitly captured because no default capture mode has been specified
2022-10-02 02:06:09 +02:00
Nicolas Werner b55b5a8321
Fix a few more warnings 2022-10-01 23:57:44 +02:00
Nicolas Werner 09babc91d2
Green is not Svg::green
fixes #1203
2022-10-01 23:57:44 +02:00
Loren Burkholder 2aef39fda8 Update some Esperanto translations 2022-10-01 13:11:05 -04:00
Nicolas Werner 42a23e1859
Reduce windows ci warnings 2022-10-01 19:05:44 +02:00
Nicolas Werner 22a6b8ddb4
Properly qualify fmt function
Otherwise it conflicts with C++20 fmt.
2022-10-01 18:05:49 +02:00
Nicolas Werner 944e369d50
Fix clazy 2022-10-01 16:30:20 +02:00
DeepBlueV7.X f8724fdea8
Merge pull request #1198 from rnhmjoj/pr-green
Add green theme color, make "error" configurable
2022-10-01 13:45:26 +00:00
Nicolas Werner b2b2932c98
Fix linting 2022-10-01 15:26:33 +02:00
Nicolas Werner 7ec842ba51
Replace some user visible mentions of spaces 2022-10-01 15:20:38 +02:00
Nicolas Werner 30882d4aa9
Fix wrong file urls 2022-10-01 14:47:42 +02:00
Michele Guerini Rocco f5d5bea840
Add green theme color, make "error" configurable 2022-10-01 10:59:17 +02:00
Nicolas Werner 2a7c6f2d86
Load components on demand 2022-10-01 02:28:02 +02:00
Nicolas Werner 570d7b8b30
Prepare for adding proxy before chat.model 2022-10-01 01:53:12 +02:00
Loren Burkholder 08aa383a62 Remove unnecessary emit 2022-09-30 00:24:43 -04:00
Loren Burkholder df834ffc48 Various grammar fixes (mostly removing commas) 2022-09-30 00:23:39 -04:00
Loren Burkholder e78d107558 Add link to repo to show where issues go 2022-09-30 00:04:50 -04:00
Nicolas Werner 78784babd1
Revert accidental animated image change 2022-09-30 04:03:39 +02:00
Nicolas Werner 1ea5449c18
Disable manpage on debian 2022-09-30 03:45:39 +02:00
Nicolas Werner c34c9f9035
Automatically switch to threading when replying 2022-09-30 03:43:42 +02:00
Nicolas Werner 88cbac1695
Basic threading support 2022-09-30 03:27:05 +02:00
Nicolas Werner bffa0115d4
Make clazy happy 2022-09-28 17:47:41 +02:00
Nicolas Werner 2fde381a82
Merge branch 'v0.10.2-fixes' 2022-09-28 14:27:54 +02:00
Nicolas Werner 051c25d5b8
Allow editing permissions in spaces recursively 2022-09-28 02:09:04 +02:00
Nicolas Werner 0752f9477e
Fix infinite loop that can be triggered by some invalid html 2022-09-27 22:02:41 +02:00
Joseph Donofry d103f793bf
If and Else blocks were backwards 2022-09-25 19:16:23 -04:00
Joseph Donofry d7fffa9f46 Make sure there are no spaces in the status string 2022-09-25 18:08:13 -04:00
Joseph Donofry e5d0244ef9
Add some additional notarization logging 2022-09-25 18:03:56 -04:00
Nicolas Werner 851333a50d
Switch to clang-format14 2022-09-25 20:05:08 +02:00
Joseph Donofry 951d0f4d23
Accepted... not Approved 2022-09-24 22:46:53 -04:00
Joseph Donofry 7b0ef054d0
apple's service cares about spaces 2022-09-24 22:16:18 -04:00
Joseph Donofry ae442f3b45
Update requestUUID source 2022-09-24 21:30:27 -04:00
Joseph Donofry 8ac87a5fbe
Use notarytool for notarization instead of altool 2022-09-24 20:57:26 -04:00
Joseph Donofry cbdcde9572
Remove expose_as for codesign job 2022-09-24 17:46:49 -04:00
Joseph Donofry 3c21e09caf
Add macos notarize logs as artifacts 2022-09-24 17:43:06 -04:00
Nicolas Werner 79ce60382a
Fix crash when deleting room summary
Since this is used across different threads, we have to delete it on the
event loop.

Thank you, q234rty, for the help with debugging this.
2022-09-24 10:36:26 +02:00
Nicolas Werner ce2d4defde
Try to handle rate limiting 2022-09-23 15:47:25 +02:00
Nicolas Werner 683fd75700
More granular automoc 2022-09-23 15:47:25 +02:00
Weblate 3b99e3826e Translated using Weblate (Russian)
Currently translated at 31.9% (265 of 830 strings)

Translated using Weblate (Russian)

Currently translated at 31.9% (265 of 830 strings)

Translated using Weblate (Russian)

Currently translated at 31.9% (265 of 830 strings)

Co-authored-by: Artem <ego.cordatus@gmail.com>
Co-authored-by: Mihail Iosilevich <mihail.iosilevitch@yandex.ru>
Co-authored-by: SOT-TECH <sblazhko@sot-te.ch>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/ru/
Translation: Nheko/nheko
2022-09-23 09:05:09 -04:00
Weblate aad97cffef Translated using Weblate (Russian)
Currently translated at 31.5% (262 of 830 strings)

Co-authored-by: SOT-TECH <sblazhko@sot-te.ch>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/ru/
Translation: Nheko/nheko
2022-09-22 16:09:04 -04:00
Nicolas Werner ed15d73d36
Allow adding non-existing userids to power levels 2022-09-22 21:24:41 +02:00
Nicolas Werner 33d45d5765
Upgrade build images 2022-09-22 20:18:08 +02:00
Nicolas Werner a8e35e5623
Set macos deployment target explicitly 2022-09-22 20:18:08 +02:00
Nicolas Werner efb9970178
Switch to C++20 2022-09-22 20:18:04 +02:00
Weblate 7efb4a22c7 Translated using Weblate (Russian)
Currently translated at 31.5% (262 of 830 strings)

Co-authored-by: SOT-TECH <sblazhko@sot-te.ch>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/ru/
Translation: Nheko/nheko
2022-09-22 10:00:56 -04:00
DeepBlueV7.X ed880248c8
Merge pull request #1190 from Bubu/patch-3
Readme: fix steam deck instructions
2022-09-22 12:46:40 +00:00
Weblate a079e370ff Translated using Weblate (Russian)
Currently translated at 31.5% (262 of 830 strings)

Translated using Weblate (Russian)

Currently translated at 31.5% (262 of 830 strings)

Translated using Weblate (Russian)

Currently translated at 31.5% (262 of 830 strings)

Co-authored-by: Herecore <herecore@protonmail.com>
Co-authored-by: Mihail Iosilevich <mihail.iosilevitch@yandex.ru>
Co-authored-by: SOT-TECH <sblazhko@sot-te.ch>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/ru/
Translation: Nheko/nheko
2022-09-22 08:02:06 -04:00
Weblate c4cb0b2c86 Translated using Weblate (Russian)
Currently translated at 31.0% (258 of 830 strings)

Translated using Weblate (Russian)

Currently translated at 31.0% (258 of 830 strings)

Translated using Weblate (Russian)

Currently translated at 31.0% (258 of 830 strings)

Co-authored-by: Alexey Murz Korepov <murznn@gmail.com>
Co-authored-by: SOT-TECH <sblazhko@sot-te.ch>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: glebasson <glebasson@yandex.ru>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/ru/
Translation: Nheko/nheko
2022-09-22 03:55:19 -04:00
Weblate 7562b03b8e Translated using Weblate (Estonian)
Currently translated at 99.7% (828 of 830 strings)

Co-authored-by: Priit Jõerüüt <nhkwlate@joeruut.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/et/
Translation: Nheko/nheko
2022-09-21 05:00:54 -04:00
Nicolas Werner b629455fab
Rename groups 2022-09-21 00:03:25 +02:00
Nicolas Werner 421b15c05c
Show the community of a room 2022-09-20 21:26:46 +02:00
Marcus 56d2a0d39d
Readme: fix steam deck instructions
Turns out that setting the desktop env isn't enough we also need to 
manually ensure kwalletd is started. As we can't tell steam to run 
multiple commands, people will need a small wrapper script that 
does this.
2022-09-20 18:44:53 +02:00
DeepBlueV7.X 7088c9bd9b
Merge pull request #1189 from Bubu/patch-1
Readme: add Steam Deck instructions
2022-09-20 10:55:02 +00:00
Marcus e46fd37dec
Readme: add Steam Deck instructions 2022-09-20 12:52:12 +02:00
Nicolas Werner fc0baa86b0
Fix const iteration 2022-09-19 21:57:25 +02:00
Nicolas Werner fe403ddc70
Rework how access rules for rooms are modified completely 2022-09-19 21:39:37 +02:00
Jason Volk 603b90a6f5
Fix copypasto in cmake bundle option descriptions. 2022-09-17 18:14:48 +02:00
DeepBlueV7.X ef2ec6d3e7
Merge pull request #1186 from q234rty/patch-1
Fix "Send by enter" on Windows
2022-09-16 16:43:49 +00:00
q234rty 15b9dbe98d
Fix "Send by enter" on Windows
Apparently on windows `Qt.inputMethod.visible` is always true when an input method is installed. Also on windows even after removing the check enter is still consumed by the input method, not nheko.
2022-09-16 22:41:11 +08:00
Nicolas Werner cd08a130c6
Make emoji escaping less aggressive 2022-09-16 15:17:48 +02:00
DeepBlueV7.X 0ebd0b0526
Merge pull request #1185 from spaetz/patch-1
Update nheko_de.ts: typo "Animiete"
2022-09-15 10:33:48 +00:00
Sebastian Spaeth 0f544d2e45
Update nheko_de.ts
Typo "Animiete"->"Animierte" and shorten the German phrase somewhat. Sigh, it is such a verbose language...
2022-09-15 11:51:07 +02:00
Weblate 59eb09cf0f Translated using Weblate (Indonesian)
Currently translated at 100.0% (830 of 830 strings)

Co-authored-by: Linerly <linerly@protonmail.com>
Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/id/
Translation: Nheko/nheko
2022-09-13 08:20:29 -04:00
Nicolas Werner 9c3ca95683
Use upstream gstreamer 2022-09-12 22:49:20 +02:00
Hiers 8071b192b8
Line to indicate first unread message (#1147)
* First draft of unread line feature.

* Minor visual fix.

* Removed unnecessary ternary operator.

* Extended unread line functionality to work on minimised window or focusing another window.

* Fix for unread line not showing when last read message is hidden.

* Minor performance improvement. Fix for misbehaving event2order DB at application start.

* Fix for possible performance issues when user has joined a large number of rooms.

* Fix for breaking macos and clazy builds.

* Changed on windows focus function to refresh unread line if room is unread.

* Unread line is removed when user sends a message.

* Linting.

* Fixed unread line to work in standalone room windows.

* Switch isRoomUnread for index 0.

* Merged try/catch blocks.

* Fix for crash on opening a room invite.

* Call fullyReadEventId function when used instead of storing it and passing it through.

* Function that was meant to sync the unread line was relying on an async function, oops.

* Linting again.

* More linting...

* Minor changes.
2022-09-11 23:05:20 +00:00
DeepBlueV7.X 02adcfdc38
Merge pull request #1163 from foresto/log-options
Control logging via command line or environment variable
2022-09-11 07:29:33 +00:00
Forest 80f7683a57 Control logging via command line and environment variables
Nheko is very chatty in its log output, generating log noise (which
complicates diagnostics) and needless disk writes (which affect power
consumption and SSD life).  This patch introduces command line options
and environment variables to control log levels and output type.

The old --debug command line option still works, at least for now.
It is overridden by the new command line options when they are used.

Partially addresses #665.
2022-09-10 18:28:44 -07:00
Nicolas Werner 12da7bd08c
Enable spoilers in replies 2022-09-11 00:29:23 +02:00
Nicolas Werner 2bdb9c4347
Fix sync with empty invite state 2022-09-10 13:19:22 +02:00
323 changed files with 58582 additions and 26829 deletions

32
.ci/macos/build.sh Executable file
View File

@ -0,0 +1,32 @@
#!/usr/bin/env sh
set -u
# unused
#TAG=$(git tag -l --points-at HEAD)
# Add Qt binaries to path
PATH="$(brew --prefix qt5):${PATH}"
export PATH
CMAKE_PREFIX_PATH="$(brew --prefix qt5)"
export CMAKE_PREFIX_PATH
cmake -GNinja -S. -Bbuild \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_PREFIX=.deps/usr \
-DHUNTER_ROOT="../.hunter" \
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF \
-DCMAKE_BUILD_TYPE=RelWithDebInfo -DHUNTER_CONFIGURATION_TYPES=RelWithDebInfo \
-DUSE_BUNDLED_OPENSSL=ON \
-DCI_BUILD=ON
cmake --build build
( cd build || exit
git clone https://github.com/Nheko-Reborn/qt-jdenticon.git
( cd qt-jdenticon || exit
qmake
make -j 4
cp libqtjdenticon.dylib ../nheko.app/Contents/MacOS
)
"$(brew --prefix qt5)/bin/macdeployqt" nheko.app -always-overwrite -qmldir=../resources/qml/
)

View File

@ -1,34 +0,0 @@
#!/usr/bin/env sh
set -eux
# unused
#TAG=$(git tag -l --points-at HEAD)
# Add Qt binaries to path
PATH=/usr/local/opt/qt@5/bin/:${PATH}
( cd build
# macdeployqt does not copy symlinks over.
# this specifically addresses icu4c issues but nothing else.
ICU_LIB="$(brew --prefix icu4c)/lib"
export ICU_LIB
mkdir -p nheko.app/Contents/Frameworks
find "${ICU_LIB}" -type l -name "*.dylib" -exec cp -a -n {} nheko.app/Contents/Frameworks/ \; || true
macdeployqt nheko.app -dmg -always-overwrite -qmldir=../resources/qml/
user=$(id -nu)
chown "${user}" nheko.dmg
mv nheko.dmg ..
)
dmgbuild -s ./.ci/macos/settings.json "Nheko" nheko.dmg
VERSION=${CI_COMMIT_SHORT_SHA}
if [ -n "$VERSION" ]; then
mv nheko.dmg "nheko-${VERSION}.dmg"
mkdir artifacts
cp "nheko-${VERSION}.dmg" artifacts/
fi

View File

@ -7,24 +7,28 @@ set -u
# Add Qt binaries to path
PATH="/usr/local/opt/qt@5/bin/:${PATH}"
export PATH
security unlock-keychain -p "${RUNNER_USER_PW}" login.keychain
( cd build || exit
# macdeployqt does not copy symlinks over.
# this specifically addresses icu4c issues but nothing else.
# We might not even need this any longer...
# ICU_LIB="$(brew --prefix icu4c)/lib"
# export ICU_LIB
# mkdir -p nheko.app/Contents/Frameworks
# find "${ICU_LIB}" -type l -name "*.dylib" -exec cp -a -n {} nheko.app/Contents/Frameworks/ \; || true
if [ -n "${CI_PIPELINE_TRIGGERED:-}" ] && [ "${TRIGGERED_BY:-}" = "cirrus" ]; then
echo "cirrus build id: ${TRIGGER_BUILD_ID}"
cat "${TRIGGER_PAYLOAD}"
# download the build artifacts from cirrus api
curl "https://api.cirrus-ci.com/v1/artifact/build/${TRIGGER_BUILD_ID}/binaries.zip" -o binaries.zip
# cirrus ci artifacts task name is 'binaries' so that's the zip name.
unzip binaries.zip
# we zip 'build/nheko.app' in cirrus ci, cirrus itself puts it in a 'build' directory
# so move it to the right place for the rest of the process.
( cd build || exit
unzip nheko.zip
)
fi
#macdeployqt nheko.app -dmg -always-overwrite -qmldir=../resources/qml/ -sign-for-notarization="${APPLE_DEV_IDENTITY}"
macdeployqt nheko.app -always-overwrite -qmldir=../resources/qml/
# user=$(id -nu)
# chown "${user}" nheko.dmg
)
if [ ! -d "build/nheko.app" ]; then
echo "nheko.app is missing, you did something wrong!"
exit 1
fi
echo "[INFO] Signing app contents"
find "build/nheko.app/Contents"|while read -r fname; do
@ -46,6 +50,7 @@ trap finish EXIT
dmgbuild -s .ci/macos/settings.json "Nheko" nheko.dmg
codesign -s "${APPLE_DEV_IDENTITY}" nheko.dmg
user=$(id -nu)
chown "${user}" nheko.dmg
@ -72,7 +77,7 @@ while sleep 60 && date; do
#isSuccess=$(grep "success" "$NOTARIZE_STATUS_LOG")
#isFailure=$(grep "invalid" "$NOTARIZE_STATUS_LOG")
echo "Status for submission \"${requestUUID}\": \"${sub_status}\""
echo "Status for submission \"${requestUUID}\": \"${sub_status}\""
if [ "${sub_status}" = "Accepted" ]; then
echo "Notarization done!"
@ -82,6 +87,7 @@ while sleep 60 && date; do
fi
if [ "${sub_status}" = "Invalid" ] || [ "${sub_status}" = "Rejected" ]; then
echo "Notarization failed"
xcrun notarytool log "${requestUUID}" --apple-id "${APPLE_DEV_USER}" --password "${APPLE_DEV_PASS}" --team-id "${APPLE_TEAM_ID}" > "$NOTARIZE_STATUS_LOG" 2>&1
cat "$NOTARIZE_STATUS_LOG" 1>&2
exit 1
fi
@ -91,7 +97,7 @@ done
VERSION=${CI_COMMIT_SHORT_SHA}
if [ -n "$VERSION" ]; then
mv nheko.dmg "nheko-${VERSION}.dmg"
mv nheko.dmg "nheko-${VERSION}_${PLAT}.dmg"
mkdir artifacts
cp "nheko-${VERSION}.dmg" artifacts/
cp "nheko-${VERSION}_${PLAT}.dmg" artifacts/
fi

24
.cirrus.yml Normal file
View File

@ -0,0 +1,24 @@
task:
macos_instance:
image: ghcr.io/cirruslabs/macos-monterey-xcode:13
name: Build - macOS Apple Silicon
only_if: $CIRRUS_REPO_OWNER == 'Nheko-Reborn'
environment:
GITLAB_TRIGGER_TOKEN: ENCRYPTED[!5fb4bbdecbde3b2c766ac7383dca573cd5ec8b815c5ac9bede0cadfe9ad70ecd3e64b1728f7840da087099f3fc1fd4f7!]
homebrew_script:
- brew bundle --file .ci/macos/Brewfile
build_script:
- export PATH="$(brew --prefix qt5)/bin/:${PATH}"
- ./.ci/macos/build.sh
zip_script:
- ditto -c -k --sequesterRsrc --keepParent build/nheko.app build/nheko.zip
gitlab_script:
- curl -X POST
--fail
-F token="${GITLAB_TRIGGER_TOKEN}"
-F ref="${CIRRUS_BRANCH}"
-F "variables[TRIGGER_BUILD_ID]=${CIRRUS_BUILD_ID}"
-F "variables[TRIGGERED_BY]=cirrus"
"https://nheko.im/api/v4/projects/2/trigger/pipeline"
binaries_artifacts:
path: build/nheko.zip

View File

@ -13,3 +13,6 @@ KeepEmptyLinesAtTheStartOfBlocks: false
PointerAlignment: Right
Cpp11BracedListStyle: true
PenaltyReturnTypeOnItsOwnLine: 0
---
BasedOnStyle: WebKit
Language: ObjC

View File

@ -13,11 +13,11 @@ build-clazy:
TRAVIS_OS_NAME: linux
before_script:
- apt-get update
- apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake liblmdb-dev
libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev
qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev
qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform
qt5keychain-dev ccache clazy libcurl4-openssl-dev libevent-dev libspdlog-dev git nlohmann-json3-dev libcmark-dev asciidoc # libolm-dev
- apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake liblmdb-dev libre2-dev
libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev
qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev
qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform
qt5keychain-dev ccache clazy libcurl4-openssl-dev libevent-dev libspdlog-dev git nlohmann-json3-dev libcmark-dev asciidoc # libolm-dev
script:
- export PATH="/usr/local/bin/:/usr/lib/ccache:${PATH}"
- export CMAKE_BUILD_PARALLEL_LEVEL=$(cat /proc/cpuinfo | awk '/^processor/{print $3}' | wc -l)
@ -28,37 +28,36 @@ build-clazy:
-DCMAKE_BUILD_TYPE=Release
-DCI_BUILD=ON -DFETCHCONTENT_QUIET=OFF -DCMAKE_CXX_COMPILER=clazy
- cmake --build build
rules:
- if : '$CI_PIPELINE_TRIGGERED == null'
cache:
key: "$CI_JOB_NAME"
paths:
- .ccache
build-gcc9:
build-gcc11:
stage: build
image: ubuntu:20.04
image: ubuntu:22.04
tags: [docker]
variables:
QT_PKG: 515
TRAVIS_OS_NAME: linux
before_script:
- apt-get update
- apt-get install -y software-properties-common
- add-apt-repository ppa:ubuntu-toolchain-r/test -y
- add-apt-repository ppa:beineri/opt-qt-5.15.2-focal -y
- apt-get update && apt-get -y install --no-install-recommends build-essential ninja-build qt${QT_PKG}{base,declarative,tools,multimedia,script,quickcontrols2,svg} liblmdb-dev libgl1-mesa-dev libssl-dev git ccache pkg-config libsecret-1-dev cmake asciidoc xsltproc
- apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake ccache liblmdb-dev
libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev
qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev
qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform
qt5keychain-dev ccache clazy libcurl4-openssl-dev libevent-dev libspdlog-dev git nlohmann-json3-dev libcmark-dev asciidoc # libolm-dev
# need recommended deps for wget
- apt-get -y install wget
- /usr/sbin/update-ccache-symlinks
- wget https://github.com/Kitware/CMake/releases/download/v3.19.0/cmake-3.19.0-Linux-x86_64.sh && sh cmake-3.19.0-Linux-x86_64.sh --skip-license --prefix=/usr/local
- rm -rf ../.hunter && mv .hunter ../.hunter || true
script:
- export PATH="/usr/local/bin/:/usr/lib/ccache:${PATH}"
- export CMAKE_BUILD_PARALLEL_LEVEL=$(cat /proc/cpuinfo | awk '/^processor/{print $3}' | wc -l)
- . "/opt/qt${QT_PKG}/bin/qt${QT_PKG}-env.sh" || true
- export PATH="/usr/lib/ccache:${PATH}"
- cmake -GNinja -H. -Bbuild
-DCMAKE_INSTALL_PREFIX=.deps/usr
-DHUNTER_ROOT="../.hunter"
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF -DUSE_BUNDLED_OPENSSL=ON -DUSE_BUNDLED_LMDB=OFF
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF -DUSE_BUNDLED_OPENSSL=ON -DUSE_BUNDLED_LMDB=OFF -DUSE_BUNDLED_QTKEYCHAIN=OFF
-DVOIP=OFF
-DCMAKE_BUILD_TYPE=Release -DHUNTER_CONFIGURATION_TYPES=Release
-DCI_BUILD=ON -DFETCHCONTENT_QUIET=OFF
@ -66,6 +65,47 @@ build-gcc9:
- cmake --build build
after_script:
- mv ../.hunter .hunter
rules:
- if : '$CI_PIPELINE_TRIGGERED == null'
cache:
key: "$CI_JOB_NAME"
paths:
- .hunter/
- .ccache
build-gcc10:
stage: build
image: debian:bullseye
tags: [docker]
variables:
TRAVIS_OS_NAME: linux
before_script:
- apt-get update
- apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake ccache liblmdb-dev
libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev
qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev
qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform
qt5keychain-dev ccache clazy libcurl4-openssl-dev libevent-dev libspdlog-dev git nlohmann-json3-dev libcmark-dev asciidoc # libolm-dev
# need recommended deps for wget
- apt-get -y install wget
- /usr/sbin/update-ccache-symlinks
- rm -rf ../.hunter && mv .hunter ../.hunter || true
script:
- export PATH="/usr/lib/ccache:${PATH}"
- cmake -GNinja -H. -Bbuild
-DCMAKE_INSTALL_PREFIX=.deps/usr
-DHUNTER_ROOT="../.hunter"
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF -DUSE_BUNDLED_OPENSSL=ON -DUSE_BUNDLED_LMDB=OFF -DUSE_BUNDLED_QTKEYCHAIN=OFF
-DVOIP=OFF
-DCMAKE_BUILD_TYPE=Release -DHUNTER_CONFIGURATION_TYPES=Release
-DCI_BUILD=ON -DFETCHCONTENT_QUIET=OFF
-DJSON_ImplicitConversions=OFF
-DMAN=OFF
- cmake --build build
after_script:
- mv ../.hunter .hunter
rules:
- if : '$CI_PIPELINE_TRIGGERED == null'
cache:
key: "$CI_JOB_NAME"
paths:
@ -78,21 +118,11 @@ build-macos:
before_script:
- rm -rf ../.hunter && mv .hunter ../.hunter || true
script:
- export PATH=/usr/local/opt/qt@5/bin/:${PATH}
- export CMAKE_PREFIX_PATH=/usr/local/opt/qt@5
- cmake -GNinja -H. -Bbuild
-DCMAKE_BUILD_TYPE=RelWithDebInfo
-DCMAKE_INSTALL_PREFIX=.deps/usr
-DHUNTER_ROOT="../.hunter"
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF
-DCMAKE_BUILD_TYPE=RelWithDebInfo -DHUNTER_CONFIGURATION_TYPES=RelWithDebInfo
-DUSE_BUNDLED_OPENSSL=ON
-DUSE_BUNDLED_BOOST=ON
-DCI_BUILD=ON
- cmake --build build
- (cd build && git clone https://github.com/Nheko-Reborn/qt-jdenticon.git && cd qt-jdenticon && qmake && make -j 4 && cp libqtjdenticon.dylib ../nheko.app/Contents/MacOS)
- ./.ci/macos/build.sh
after_script:
- mv ../.hunter .hunter
rules:
- if : '$CI_PIPELINE_TRIGGERED == null'
artifacts:
paths:
- build/nheko.app
@ -108,22 +138,27 @@ build-macos:
codesign-macos:
stage: deploy
tags: [macos]
variables:
PLAT: "intel"
before_script:
- 'brew upgrade qt@5'
- pip3 install dmgbuild
script:
- export PATH=/usr/local/opt/qt@5/bin/:${PATH}
- ./.ci/macos/notarize.sh
after_script:
- ./.ci/upload-nightly-gitlab.sh artifacts/nheko-${CI_COMMIT_SHORT_SHA}.dmg
- ./.ci/upload-nightly-gitlab.sh artifacts/nheko-${CI_COMMIT_SHORT_SHA}_${PLAT}.dmg
needs:
- build-macos
- job: build-macos
optional: true # optional since we want to be able to also trigger this job from cirrus ci for apple silicon builds.
rules:
- if: '$CI_COMMIT_BRANCH == "master"'
- if : '$CI_PIPELINE_TRIGGERED && $CI_COMMIT_REF_PROTECTED == "true"'
variables:
PLAT: "m1"
- if : '$CI_COMMIT_BRANCH == "master"'
- if : $CI_COMMIT_TAG
artifacts:
paths:
- artifacts/nheko-${CI_COMMIT_SHORT_SHA}.dmg
- artifacts/nheko-${CI_COMMIT_SHORT_SHA}_${PLAT}.dmg
- /tmp/notarize*
name: nheko-${CI_COMMIT_SHORT_SHA}-macos
@ -135,17 +170,19 @@ build-flatpak-amd64:
before_script:
- apt-get update && apt-get -y install flatpak-builder git python3 curl python3-aiohttp python3-tenacity gir1.2-ostree-1.0
- flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
- flatpak --noninteractive install --user flathub org.kde.Platform//5.15-21.08
- flatpak --noninteractive install --user flathub org.kde.Sdk//5.15-21.08
# see https://github.com/flatpak/flatpak-builder/issues/495
- git config --global protocol.file.allow always
script:
- export VERSION=$(git describe)
- mkdir -p build-flatpak
- cd build-flatpak
- flatpak-builder --user --disable-rofiles-fuse --ccache --repo=repo --default-branch=${CI_COMMIT_REF_NAME//\//_} --subject="Build of Nheko ${VERSION} `date`" app ../io.github.NhekoReborn.Nheko.yaml
- flatpak-builder --install-deps-from=flathub --user --disable-rofiles-fuse --ccache --repo=repo --default-branch=${CI_COMMIT_REF_NAME//\//_} --subject="Build of Nheko ${VERSION} `date`" app ../io.github.NhekoReborn.Nheko.yaml
- flatpak build-bundle repo nheko-amd64.flatpak io.github.NhekoReborn.Nheko ${CI_COMMIT_REF_NAME//\//_}
after_script:
- (cd ./scripts && ./upload-to-flatpak-repo.sh ../build-flatpak/repo) || true
- bash ./.ci/upload-nightly-gitlab.sh build-flatpak/nheko-amd64.flatpak
- (cd ./scripts && ./upload-to-flatpak-repo.sh ../build-flatpak/repo) || true
rules:
- if : '$CI_PIPELINE_TRIGGERED == null'
cache:
key: "$CI_JOB_NAME"
paths:
@ -163,17 +200,20 @@ build-flatpak-arm64:
before_script:
- apt-get update && apt-get -y install flatpak-builder git python3 curl python3-aiohttp python3-tenacity gir1.2-ostree-1.0
- flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
- flatpak --noninteractive install --user flathub org.kde.Platform//5.15-21.08
- flatpak --noninteractive install --user flathub org.kde.Sdk//5.15-21.08
# see https://github.com/flatpak/flatpak-builder/issues/495
- git config --global protocol.file.allow always
script:
- export VERSION=$(git describe)
- if [ "$(grep MemTotal /proc/meminfo | tr -cd '[0-9]')" -lt "6000000" ]; then export EXTRA_FLAGS='--jobs=3'; fi
- mkdir -p build-flatpak
- cd build-flatpak
- flatpak-builder --user --disable-rofiles-fuse --ccache --repo=repo --default-branch=${CI_COMMIT_REF_NAME//\//_} --subject="Build of Nheko ${VERSION} `date` for arm64" app ../io.github.NhekoReborn.Nheko.yaml
- flatpak-builder --install-deps-from=flathub --user --disable-rofiles-fuse --ccache $EXTRA_FLAGS --repo=repo --default-branch=${CI_COMMIT_REF_NAME//\//_} --subject="Build of Nheko ${VERSION} `date` for arm64" app ../io.github.NhekoReborn.Nheko.yaml
- flatpak build-bundle repo nheko-arm64.flatpak io.github.NhekoReborn.Nheko ${CI_COMMIT_REF_NAME//\//_}
after_script:
- (cd ./scripts && ./upload-to-flatpak-repo.sh ../build-flatpak/repo) || true
- bash ./.ci/upload-nightly-gitlab.sh build-flatpak/nheko-arm64.flatpak
- (cd ./scripts && ./upload-to-flatpak-repo.sh ../build-flatpak/repo) || true
rules:
- if : '$CI_PIPELINE_TRIGGERED == null'
cache:
key: "$CI_JOB_NAME"
paths:
@ -183,15 +223,83 @@ build-flatpak-arm64:
paths: ['build-flatpak/nheko-arm64.flatpak']
name: flatpak-${CI_COMMIT_REF_NAME}-${VERSION}-arm64
appimage-amd64:
stage: build
image: ubuntu:22.04
tags: [docker]
allow_failure: true
before_script:
# Installing the packages needed to download and install third-party tools
- apt-get update && apt-get install -y software-properties-common git wget curl python3 python3-pip python3-setuptools
# Installing the packages needed to compile nheko and third-party tools
- apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake ccache liblmdb-dev
libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev
qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev
qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform
qt5keychain-dev ccache clazy libcurl4-openssl-dev libevent-dev libspdlog-dev nlohmann-json3-dev libcmark-dev asciidoc libre2-dev libgtest-dev libgl1-mesa-dev qml-module-qtquick-particles2
# Installing the packages needed to build AppImage
- apt-get -yq install breeze-icon-theme desktop-file-utils elfutils fakeroot file gnupg2 gtk-update-icon-cache libgdk-pixbuf2.0-dev libgdk-pixbuf2.0-0 libglib2.0-bin librsvg2-dev libyaml-dev strace zsync squashfs-tools
- wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O /usr/local/bin/appimagetool && \
- chmod +x /usr/local/bin/appimagetool
- export HOME_DIR=$(pwd)
# Workaround for https://github.com/AppImageCrafters/appimage-builder/issues/280
- cd /tmp
- git clone https://github.com/AppImageCrafters/appimage-builder
- cd appimage-builder
- git checkout 9733877eed75aea0fa8e9a1cd26c22d77a10aa4a
- pip3 install .
- pip3 install cffi
- cd $HOME_DIR
- /usr/sbin/update-ccache-symlinks
- rm -rf ../.hunter && mv .hunter ../.hunter || true
script:
- export PATH="/usr/local/bin/:/usr/lib/ccache:${PATH}"
- cmake -GNinja -H. -Bbuild
-DCMAKE_INSTALL_PREFIX=/usr
-DHUNTER_ROOT=".hunter"
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF -DUSE_BUNDLED_OPENSSL=ON -DUSE_BUNDLED_LMDB=OFF -DUSE_BUNDLED_QTKEYCHAIN=OFF -DUSE_BUNDLED_LIBEVENT=OFF
-DVOIP=OFF -DMAN=OFF
-DCMAKE_BUILD_TYPE=Release -DHUNTER_CONFIGURATION_TYPES=Release
-DCI_BUILD=ON -DFETCHCONTENT_QUIET=OFF
-DJSON_ImplicitConversions=OFF
- DESTDIR=`pwd`/AppDir ninja -C build install/local
- DESTDIR=`pwd`/AppDir ninja -C build _deps/cmark-build/src/install
- mkdir -p AppDir/usr/lib/x86_64-linux-gnu AppDir/lib/x86_64-linux-gnu
- appimage-builder --skip-test
after_script:
- bash ./.ci/upload-nightly-gitlab.sh nheko-latest-x86_64.AppImage
rules:
- if : '$CI_PIPELINE_TRIGGERED == null'
artifacts:
paths:
- 'nheko-latest-x86_64.AppImage'
expire_in: 1 week
expose_as: 'appimage-amd64'
cache:
key: "$CI_JOB_NAME"
paths:
- .hunter/
- .ccache
linting:
stage: build
image: alpine:latest
tags: [docker]
before_script:
- apk update && apk add clang-extra-tools make git python3 py3-pip
- apk update && apk add make git python3 py3-pip
- apk add clang-extra-tools --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main
- export PATH="$PATH:/root/.local/bin"
- pip3 install --user reuse
script:
- make lint
- make license
rules:
- if : '$CI_PIPELINE_TRIGGERED == null'

122
AppImageBuilder.yml Normal file
View File

@ -0,0 +1,122 @@
# appimage-builder recipe see https://appimage-builder.readthedocs.io for details
version: 1
AppDir:
path: ./AppDir
app_info:
id: nheko
name: nheko
icon: nheko
version: latest
exec: usr/bin/nheko
exec_args: $@
runtime:
env:
APPDIR_LIBRARY_PATH: $APPDIR/usr/lib/x86_64-linux-gnu:$APPDIR/usr/lib/x86_64-linux-gnu/gstreamer-1.0:$APPDIR/usr/lib/x86_64-linux-gnu/gconv:$APPDIR/lib/x86_64-linux-gnu:$APPDIR/usr/lib/x86_64-linux-gnu/pulseaudio
apt:
arch: amd64
allow_unauthenticated: true
sources:
- sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse
- sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted universe multiverse
- sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
- sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse
- sourceline: deb http://archive.canonical.com/ubuntu jammy partner
key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x871920d1991bc93c
include:
# idk, need there ca-certificates, but some systems may not have
- ca-certificates
- gstreamer1.0-plugins-good
- libbs2b0
- libbz2-1.0
- libcurl4
- libelf1
- libexpat1
- libevent-core-2.1-7
- libevent-pthreads-2.1-7
- libjpeg-turbo8
- libkf5archive5
- liblmdb0
- liblz4-1
- libnorm1
- libnss-mdns
- libpcre3
- qml-module-qt-labs-platform
- qml-module-qt-labs-settings
- qml-module-qtgraphicaleffects
- qml-module-qtquick-particles2
- qml-module-qtmultimedia
- qml-module-qtquick2
- qml-module-qtquick-controls2
- qml-module-qtquick-layouts
- qml-module-qtquick-window2
- libcmark0.30.2
- libfmt8
- libolm3
- libqt5core5a
- libqt5dbus5
- libqt5gui5
- libqt5keychain1
- libqt5multimedia5
- libqt5multimedia5-plugins
- libqt5network5
- libqt5quickwidgets5
- libqt5svg5
- libqt5widgets5
- libspdlog1-fmt8
- libxcb-ewmh2
- libxcb1
- librubberband2
- libsm6
- libsnappy1v5
- libxau6
- libxcb-render-util0
- libxcb-sync1
- libxcb-xinerama0
- libxcb-xkb1
- libxcursor1
- libxdmcp6
- libxext6
- libxfixes3
- libxrender1
- libxshmfence1
- libxv1
- libxxf86vm1
- libzstd1
exclude: []
files:
exclude:
- usr/share/man
- usr/share/doc
- usr/bin/cmark
- usr/bin/dbus*
- usr/bin/openssl
- usr/bin/c_rehash
- usr/bin/session-migration
- usr/include
- usr/sbin
- lib/systemd
test:
fedora:
image: appimagecrafters/tests-env:fedora-30
command: ./AppRun
use_host_x: true
debian:
image: appimagecrafters/tests-env:debian-stable
command: ./AppRun
use_host_x: true
arch:
image: appimagecrafters/tests-env:archlinux-latest
command: ./AppRun
use_host_x: true
centos:
image: appimagecrafters/tests-env:centos-7
command: ./AppRun
use_host_x: true
ubuntu:
image: appimagecrafters/tests-env:ubuntu-xenial
command: ./AppRun
use_host_x: true
AppImage:
arch: x86_64
update-information: None
sign-key: None

View File

@ -1,5 +1,192 @@
# Changelog
## [0.11.3] -- 2023-02-23
### Bugfix
- Fix redundant null byte inserted with the emoji completer
## [0.11.2] -- 2023-02-20
### Highlights
- Improved Markdown input 🗒️
- You can now enter strike-through and spoilers using `~~` and `||`
respectively.
- Single line-breaks now also create a line-break in the formatted message.
- Code tags now preserve whitespace.
- User search in the invite dialog 🧑‍🤝‍🧑 (Malte E)
- Can search either locally or consult the user directory on your server.
### Features
- Allow disabling animations before login.
- Set the window role to "imageoverlay" on X11. (Thulinma)
### Improvements
- The Nheko binary should now be slightly smaller.
- You can now build Nheko against a system install of the blurhash and
cpp-httplib libraries. (vitaly)
- You can now enable scrollbars for the room and community lists in the
settings. (balsof)
- Add a generic video icon when there is no thumbnail. (LorenDB)
- Pause video when switching rooms. (LorenDB)
- Add a fancy delegate when encryption is enabled. (LorenDB)
- Standardise command format messages. (phyto)
- Automatically fetch keys for undecrypted messages after verification.
- Remove all notifications on exit on Linux. (ShootingStarDragons)
- Document markdown features and /cmark command in the man page. (tastytea)
- Speedup the user completer.
- Allow closing menus on Wayland by clicking the window. (ShootingStarDragons)
- Merge Debian/Ubuntu Dependencies in the README. (enigma9o7)
- Update zsh completions. (tastytea)
- Skip empty requests for cross-signing keys when user only has one device.
(Jason)
- Hide image overlay when saving a file. (ShootingStarDragons)
- Make it more obvious that the add reaction button is not an emoji.
- Build only the gstreamer qml plugin in flatpak.
- Update Ubuntu dependency list for building from source. (tastytea)
### Translations
- Estonian (Priit)
- Ukrainian (NullPointerException)
- Indonesian (Linerly)
- Chinese (Poesty Li)
- Esperanto (Tirifto)
- French (MayeulC, CB, Glandos, Rick)
- Dutch (Thulinma)
- Italian (DynamoFox, Elia Tomasi, Joseph Curto, Quanterxotur)
- Russian (Evgeny, SOT-TECH)
- Finnish (Lurkki)
### Bugfixes
- You can now forward stickers again.
- Edits shouldn't "jump" out of threads anymore.
- Focus text input when quick switcher is closed. (LorenDB)
- Fix rare freeze with an empty list in a completer.
- Don't fail the plugins check on GStreamer 1.22 during a video call.
- Allow nested ()/[] brackets in URLs. (mauke)
- Make br tags work properly again.
- Don't double free call devices. (Jason)
- Work around multiple destructor calls on Clang. (Jason)
- Html in sidebar.
### Notes
You may want to build against the most recent mtxclient (0.9.2) for additional
bugfixes. cpp-httplib and blurhash are still bundled by default and shipped with
the source tarball. Explicitly disable the bundling for those packages to build
against system versions.
## [0.11.1] -- 2023-01-15
### Hotfix Release
- Fixes issue where CPU usage could be excessive even when nheko was idle or minimized. (See #1284)
- Add failed state for queued (pending) messages
## [0.11.0] -- 2023-01-12
### Highlights
- Search in your timeline 🔍
- Works in encrypted rooms.
- Search is entirely local.
- It might be a bit slow on some systems, since it needs to paginate the room
to search instead of relying on the server.
- Pushrule support! 🫸🫷
- Notifications should now be faster and not rely on the server.
- Notifications should work properly in encrypted rooms.
- MSC3664 is supported for pushrules for reply (needs server support).
- Mentions get highlighted in the timeline.
- Decrypting notifications can be disabled for improved privacy.
- Threads 🧵
- Threads are a simple way to structure large rooms.
- Start a new thread from any event.
- Focus on a specific thread by clicking on the colored thread button next to
any event from this thread.
- Replies automatically land inside the thread.
### Features
- Remember where you left off using the new unread indicator! ---
- Navigate to space when selected in quick switcher or via link.
- (Re-)Add an AppImage build. (Zhymabek Roman)
- Render and send confetti! 🎉 (LorenDB)
- Focus text field on most key presses.
- Show link to next room for tombstone events.
- macOS: Only play notification sound when pushrule says so.
- macOS: Builds for Apple Silicon.
- macOS: Allow quick replies from notifications.
- Completer for /commands.
- Allow opening room settings from room list. (LorenDB)
- Allow setting the status message via the dbus API. (LorenDB)
- Check out this for one possible usecase: https://schlomp.space/tastytea/dotfiles/src/commit/485aa7103c4f414ce0731804acf34a65a772fd28/.local/bin/mpd2nheko (Setting your currently playing song as your status)
- Allow swapping Enter and Shift-Enter. (LordMZTE)
- Preliminary support for VoIP v1. (Rohit)
- Allow applying permission changes in spaces recursively.
- Allow modifying permissions of users not in the room.
### Improvements
- Prompt before deleting the database when the error could be resolved by the user.
- Improve logging in particular for sync or registration errors.
- Speedup quick switcher.
- Prune image cache in the background.
- Store all secrets encrypted in the database (apart from the pickle).
- Speedup fetching olm sessions from the database.
- Increase database resiliency at the cost of a lot of performance.
- Rename spaces to communities.
- Handle some rate limiting better in some cases.
- More fine grained control over logging. (Forest)
### Translations
- Ukrainian (NullPointerException)
- Indonesian (Linerly as always &lt;3)
- Portugese (Brazil) (Daimar, zerowhy, Terry)
- Estonian (Priit also a valued regular)
- Finnish (Lurkki, you might know them too!)
- Chinese (Chen Shaoji, Poesty Li, ling, Eric)
- Russian (SOT-TECH, Evgeny, Carmina16, Mihail Iosilevich, Artem, Herecore, Alexey Murz, glebasson)
- Occidental (Carmina16)
- Polish (Romanik)
- Dutch (Thulinma)
- French (GitEz-code, Guillaume Girol, lascapi)
- Esperanto (Tirifto)
### Bugfixes
- Fix regional indicators. ‌🇦‌-‌🇿‌
- Pasting from Safari on macOS.
- Potential crash when closing the room directory.
- text selection in the raw message dialog.
- Pagination after a timeline clear.
- Entering newlines on Windows.
- Work around crash in QQC2 in alias dialog.
- Fix forwarding between encrypted rooms.
- Blurry icons on HiDPI screens. (q234rty)
- Fix CMark warning when configuring. (FINALLY!)
- Blurry thumbnails. (again?!?)
- Upload box thumbnail size. (foxb612)
- Previews getting sorted above normal rooms in space view.
- Excessive summary calls.
- Usage type buttons for Sticker/Emoji packs.
- Old server lookups overwriting new ones, possibly preventing any login.
- Crash in member list.
- Stripping fallbacks of plain text bodies.
- Different greens.
- Spoilers in replies.
- Invites without state.
### Notes
We bumped the required mtxclient version to 0.9.0 and the required coeurl
version to 0.3.0. Supported Matrix API versions are now 1.1 to 1.5.
## [0.10.2] -- 2022-09-22
### Security release

View File

@ -18,17 +18,16 @@ set(
CACHE
FILEPATH "Default toolchain"
)
set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard")
set(CMAKE_CXX_STANDARD 20 CACHE STRING "C++ standard")
set(CMAKE_CXX_STANDARD_REQUIRED ON CACHE BOOL "Require C++ standard to be supported")
set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL "compile as PIC by default")
set(CMAKE_AUTOMOC ON)
option(HUNTER_ENABLED "Enable Hunter package manager" OFF)
include("cmake/HunterGate.cmake")
HunterGate(
URL "https://github.com/cpp-pm/hunter/archive/v0.24.3.tar.gz"
SHA1 "10738b59e539818a01090e64c2d09896247530c7"
LOCAL
URL "https://github.com/cpp-pm/hunter/archive/v0.24.8.tar.gz"
SHA1 "ca7838dded9a1811b04ffd56175f629e0af82d3d"
LOCAL
)
macro(hunter_add_package_safe)
@ -60,8 +59,11 @@ option(USE_BUNDLED_LMDBXX "Use the bundled version of lmdb++." ${HUNTER_ENABLED}
option(USE_BUNDLED_QTKEYCHAIN "Use the bundled version of Qt5Keychain." ${HUNTER_ENABLED})
option(USE_BUNDLED_COEURL "Use a bundled version of the Curl wrapper"
${HUNTER_ENABLED})
option(USE_BUNDLED_LIBEVENT "Use the bundled version of spdlog." ${HUNTER_ENABLED})
option(USE_BUNDLED_LIBCURL "Use the bundled version of spdlog." ${HUNTER_ENABLED})
option(USE_BUNDLED_LIBEVENT "Use the bundled version of libevent." ${HUNTER_ENABLED})
option(USE_BUNDLED_LIBCURL "Use the bundled version of libcurl." ${HUNTER_ENABLED})
option(USE_BUNDLED_RE2 "Use the bundled version of re2." ${HUNTER_ENABLED})
option(USE_BUNDLED_CPPHTTPLIB "Use the bundled version of cpp-httplib." ON)
option(USE_BUNDLED_BLURHASH "Use the bundled version of blurhash." ON)
include(CMakeDependentOption)
set(VOIP_DEFAULT ON)
@ -107,8 +109,8 @@ project(nheko LANGUAGES CXX C)
include(GNUInstallDirs)
set(CPACK_PACKAGE_VERSION_MAJOR "0")
set(CPACK_PACKAGE_VERSION_MINOR "10")
set(CPACK_PACKAGE_VERSION_PATCH "2")
set(CPACK_PACKAGE_VERSION_MINOR "11")
set(CPACK_PACKAGE_VERSION_PATCH "3")
set(PROJECT_VERSION_MAJOR ${CPACK_PACKAGE_VERSION_MAJOR})
set(PROJECT_VERSION_MINOR ${CPACK_PACKAGE_VERSION_MINOR})
set(PROJECT_VERSION_PATCH ${CPACK_PACKAGE_VERSION_PATCH})
@ -119,7 +121,7 @@ fix_project_version()
# Set additional project information
set(COMPANY "Nheko")
set(COPYRIGHT "Copyright (c) 2022 Nheko Contributors")
set(COPYRIGHT "Copyright (c) 2023 Nheko Contributors")
set(IDENTIFIER "io.github.nheko-reborn.nheko")
add_project_meta(META_FILES_TO_INCLUDE)
@ -186,13 +188,13 @@ if(USE_BUNDLED_COEURL)
FetchContent_Declare(
coeurl
GIT_REPOSITORY https://nheko.im/Nheko-Reborn/coeurl.git
GIT_TAG v0.2.1
GIT_TAG v0.3.0
)
FetchContent_MakeAvailable(coeurl)
set(COEURL_TARGET_NAME coeurl::coeurl)
else()
find_package(PkgConfig)
pkg_check_modules(coeurl IMPORTED_TARGET coeurl>=0.1.1)
pkg_check_modules(coeurl IMPORTED_TARGET coeurl>=0.3.0)
if (TARGET PkgConfig::coeurl)
set(COEURL_TARGET_NAME PkgConfig::coeurl)
endif()
@ -209,6 +211,15 @@ if (NOT COEURL_TARGET_NAME)
message(ERROR "Couldn't find coeurl")
endif()
if(USE_BUNDLED_RE2)
hunter_add_package(re2)
find_package(re2 CONFIG REQUIRED)
else()
find_package(PkgConfig REQUIRED)
pkg_check_modules(re2 REQUIRED IMPORTED_TARGET re2)
endif()
#
# LMDB
#
@ -365,6 +376,8 @@ set(SRC_FILES
src/timeline/Reaction.h
src/timeline/RoomlistModel.cpp
src/timeline/RoomlistModel.h
src/timeline/TimelineFilter.cpp
src/timeline/TimelineFilter.h
src/timeline/TimelineModel.cpp
src/timeline/TimelineModel.h
src/timeline/TimelineViewManager.cpp
@ -391,8 +404,6 @@ set(SRC_FILES
src/ui/RoomSummary.h
src/ui/Theme.cpp
src/ui/Theme.h
src/ui/ThemeManager.cpp
src/ui/ThemeManager.h
src/ui/UIA.cpp
src/ui/UIA.h
src/ui/UserProfile.cpp
@ -440,6 +451,8 @@ set(SRC_FILES
src/ColorImageProvider.h
src/CombinedImagePackModel.cpp
src/CombinedImagePackModel.h
src/CommandCompleter.cpp
src/CommandCompleter.h
src/CompletionModelRoles.h
src/CompletionProxyModel.cpp
src/CompletionProxyModel.h
@ -480,6 +493,8 @@ set(SRC_FILES
src/SingleImagePackModel.h
src/TrayIcon.cpp
src/TrayIcon.h
src/UserDirectoryModel.cpp
src/UserDirectoryModel.h
src/UserSettingsPage.cpp
src/UserSettingsPage.h
src/UsersModel.cpp
@ -581,14 +596,14 @@ if(USE_BUNDLED_MTXCLIENT)
include(FetchContent)
FetchContent_Declare(
MatrixClient
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
GIT_TAG v0.8.2
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
GIT_TAG v0.9.2
)
set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "")
set(BUILD_LIB_TESTS OFF CACHE INTERNAL "")
FetchContent_MakeAvailable(MatrixClient)
else()
find_package(MatrixClient 0.8.1 REQUIRED)
find_package(MatrixClient 0.9.0 REQUIRED)
endif()
if (VOIP)
@ -618,9 +633,9 @@ set(TRANSLATION_DEPS ${LANG_QRC} ${QRC} ${QM_SRC})
if (APPLE)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework Foundation -framework Cocoa -framework UserNotifications")
set(SRC_FILES ${SRC_FILES} src/notifications/ManagerMac.mm src/notifications/ManagerMac.cpp src/emoji/MacHelper.mm src/emoji/MacHelper.h)
set(SRC_FILES ${SRC_FILES} src/notifications/NotificationManagerProxy.h src/notifications/MacNotificationDelegate.h src/notifications/MacNotificationDelegate.mm src/notifications/ManagerMac.mm src/notifications/ManagerMac.cpp src/emoji/MacHelper.mm src/emoji/MacHelper.h)
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.16.0")
set_source_files_properties( src/notifications/ManagerMac.mm src/emoji/MacHelper.mm src/emoji/MacHelper.h PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
set_source_files_properties( src/notifications/NotificationManagerProxy.h src/notifications/MacNotificationDelegate.h src/notifications/MacNotificationDelegate.mm src/notifications/ManagerMac.mm src/emoji/MacHelper.mm src/emoji/MacHelper.h PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
endif()
elseif (WIN32)
file(DOWNLOAD
@ -664,6 +679,11 @@ else()
endif()
endif()
set_target_properties(nheko
PROPERTIES
CMAKE_SKIP_INSTALL_RPATH TRUE
AUTOMOC ON)
if(APPLE)
target_link_libraries (nheko PRIVATE Qt5::MacExtras)
elseif(WIN32)
@ -679,13 +699,28 @@ else()
endif()
endif()
target_include_directories(nheko PRIVATE src includes third_party/blurhash third_party/cpp-httplib-0.5.12)
set(THIRD_PARTY_SRC_FILES
third_party/blurhash/blurhash.cpp
third_party/blurhash/blurhash.hpp
third_party/cpp-httplib-0.5.12/httplib.h
target_include_directories(nheko PRIVATE src includes)
if (USE_BUNDLED_CPPHTTPLIB)
target_include_directories(nheko PRIVATE third_party/cpp-httplib-0.5.12)
target_sources(nheko PRIVATE third_party/cpp-httplib-0.5.12/httplib.h)
else()
find_package(httplib REQUIRED)
target_link_libraries(nheko PRIVATE httplib::httplib)
endif()
if (USE_BUNDLED_BLURHASH)
target_include_directories(nheko PRIVATE third_party/blurhash)
set(BLURHASH_SRC_FILES
third_party/blurhash/blurhash.cpp
third_party/blurhash/blurhash.hpp
)
target_sources(nheko PRIVATE ${THIRD_PARTY_SRC_FILES})
target_sources(nheko PRIVATE ${BLURHASH_SRC_FILES})
else()
find_package(PkgConfig REQUIRED)
pkg_check_modules(blurhash REQUIRED IMPORTED_TARGET blurhash)
target_link_libraries(nheko PRIVATE PkgConfig::blurhash)
endif()
# Fixup bundled keychain include dirs
if (USE_BUNDLED_QTKEYCHAIN)
@ -757,8 +792,6 @@ if(MAN)
add_subdirectory(man)
endif()
set_target_properties(nheko PROPERTIES CMAKE_SKIP_INSTALL_RPATH TRUE)
if(UNIX AND NOT APPLE)
if(FLATPAK)
set(APPID "io.github.NhekoReborn.Nheko")

View File

@ -99,6 +99,11 @@ sudo emerge -a nheko
If you are using Gnome Keyring or KeepassXC as your secrets daemon, ensure that the `gnome-keyring` useflag is enabled on `dev-libs/qtkeychain`.
#### Mageia (9 and above)
```bash
sudo urpmi nheko
```
#### Nix(os)
```bash
@ -144,6 +149,15 @@ flatpak install flathub io.github.NhekoReborn.Nheko
guix install nheko
```
#### Steam Deck
Install nheko via the `Discover` app in Desktop Mode (this installs the flatpak). To also make it work in Game Mode you'll have create a wrapper script that starts kwalletd and then nheko. You can create `/home/deck/nheko.sh` with the following content and then add this script as a "Non-Steam Game" to Steam.
```bash
#!/bin/sh
kwalletd5&
flatpak run --env=XDG_CURRENT_DESKTOP=KDE --env=KDE_SESSION_VERSION=5 --branch=stable --arch=x86_64 --command=io.github.NhekoReborn.Nheko --file-forwarding io.github.NhekoReborn.Nheko @@u @@
```
#### macOS (10.14 and above)
with [homebrew](https://brew.sh/):
@ -216,6 +230,15 @@ sharing easier.
---
**Q:** I can't see some image types!
**A:** Nheko uses Qt's image plugins to render images. You might need to install
additional packages to display some image types like webp. Usually those
packages are called `qt5-image-formats-plugins`, `qt5-imageformats` or similar.
KDE has similar plugins, that can extend the supported image types even more.
---
### Build Requirements
- Qt5 (5.15 or greater). Required for overlapping hover handlers in Qml.
@ -223,10 +246,10 @@ sharing easier.
- [mtxclient](https://github.com/Nheko-Reborn/mtxclient)
- [coeurl](https://nheko.im/nheko-reborn/coeurl)
- [LMDB](https://symas.com/lightning-memory-mapped-database/)
- [lmdb++](https://github.com/hoytech/lmdbxx)
- [lmdb++](https://github.com/hoytech/lmdbxx) (0.9.14 too old)
- [cmark](https://github.com/commonmark/cmark) 0.29 or greater.
- [libolm](https://gitlab.matrix.org/matrix-org/olm)
- [spdlog](https://github.com/gabime/spdlog)
- [spdlog](https://github.com/gabime/spdlog) (1.8.1 too old)
- [GStreamer](https://gitlab.freedesktop.org/gstreamer) 1.18.0 or greater (optional, needed for VoIP support. Pass `-DVOIP=OFF` to disable.).
- Installing the gstreamer core library plus gst-plugins-base, gst-plugins-good & gst-plugins-bad
is often sufficient. The qmlgl plugin though is often packaged separately. The actual plugin requirements
@ -236,9 +259,9 @@ sharing easier.
- [libnice](https://gitlab.freedesktop.org/libnice/libnice)
- XCB, XCB-EWMH: For screensharing support on X11. VOIP needs to be enabled. Can be disabled with `-DSCREENSHARE_X11=OFF`.
- [qtkeychain](https://github.com/frankosterfeld/qtkeychain) (You need at least version 0.12 for proper Gnome Keychain support. The bundled version requires libsecret, unless you pass `-DLIBSECRET_SUPPORT=OFF`.)
- A compiler that supports C++ 17:
- Clang 6 (tested on Travis CI)
- GCC 7 (tested on Travis CI)
- A compiler that supports C++ 20:
- Clang 11 (Only clazy 13 is tested in CI)
- GCC 10 (tested on Gitlab CI)
- MSVC 19.13 (tested on AppVeyor)
Nheko can use bundled version for most of those libraries automatically, if the versions in your distro are too old.
@ -264,7 +287,7 @@ The bundle flags are currently:
A note on bundled OpenSSL: You need to explicitly enable it and it will not be using your system certificate directory by default, if you enable it. You need to override that at runtime with the SSL_CERT_FILE variable. On Windows it will still be using your system certificates though, since it loads them from the system store instead of the OpenSSL directory.
#### Linux
#### Linux (Appimage)
If you don't want to install any external dependencies, you can generate an AppImage locally using docker. It is not that well maintained though...
@ -272,7 +295,7 @@ If you don't want to install any external dependencies, you can generate an AppI
make docker-app-image
```
##### Arch Linux
#### Arch Linux
```bash
sudo pacman -S qt5-base \
@ -288,61 +311,51 @@ sudo pacman -S qt5-base \
qtkeychain-qt5
```
##### Gentoo Linux
#### Debian 11+ / Ubuntu 22.04
*Older OS versions require a newer version of Qt5 than offered in official repositories.*
*Build requirements + qml modules needed at runtime (you may not need all of them, but the following seem to work according to reports):*
```bash
sudo emerge -a ">=dev-qt/qtgui-5.10.0" media-libs/fontconfig dev-libs/qtkeychain
sudo apt install --no-install-recommends g++ cmake make zlib1g-dev libssl-dev libolm-dev liblmdb-dev libcmark-dev nlohmann-json3-dev libspdlog-dev libevent-dev libcurl4-openssl-dev libre2-dev libxcb-ewmh-dev asciidoc-base \
qt{base,declarative,tools,multimedia,quickcontrols2-}5-dev libqt5svg5-dev qt5keychain-dev qml-module-qt{gstreamer,multimedia,quick-extras,-labs-settings,-labs-platform,graphicaleffects,quick-controls2,quick-particles2} \
libgstreamer1.0-dev libgstreamer-plugins-{base,bad}1.0-dev qtgstreamer-plugins-qt5 libnice-dev
```
lmdb++-dev is too old so bundled lmdbxx must be used.
libspdlog-dev in debian bullseye is too old (without backporting) so requires using hunter to use bundled spdlog.
Suggested flags for debian bullseye: `-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF -DUSE_BUNDLED_OPENSSL=OFF`
Suggested flags for debian bookworm: `-DUSE_BUNDLED_COEURL=1 -DUSE_BUNDLED_MTXCLIENT=1 -DUSE_BUNDLED_LMDBXX=1`
##### Ubuntu 20.04
```bash
# Build requirements + qml modules needed at runtime (you may not need all of them, but the following seem to work according to reports):
sudo apt install g++ cmake zlib1g-dev libssl-dev qt{base,declarative,tools,multimedia,quickcontrols2-}5-dev libqt5svg5-dev libboost-system-dev libboost-thread-dev libboost-iostreams-dev libolm-dev liblmdb++-dev libcmark-dev nlohmann-json3-dev libspdlog-dev libgtest-dev qml-module-qt{gstreamer,multimedia,quick-extras,-labs-settings,-labs-platform,graphicaleffects,quick-controls2} qt5keychain-dev libevent-dev libcurl-dev
```
This will install all dependencies, except for tweeny (use bundled tweeny)
and mtxclient (needs to be build separately).
##### Debian Buster (or higher probably)
(User report, not sure if all of those are needed)
```bash
sudo apt install cmake gcc make automake liblmdb-dev \
qt5-default libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev \
qml-module-qtgstreamer qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev \
qml-module-qtgraphicaleffects qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform\
qt5keychain-dev asciidoctor libsecret-1-dev
```
##### Fedora
#### Fedora
```bash
sudo dnf builddep nheko # note that some newer packages might not be captured by that
```
##### Guix
#### Gentoo Linux
```bash
sudo emerge -a ">=dev-qt/qtgui-5.15.0" media-libs/fontconfig dev-libs/qtkeychain
```
#### Guix
```bash
guix environment nheko
```
##### macOS (Xcode 10.2 or later)
#### macOS (Xcode 10.2 or later)
```bash
brew update
brew install qt5 lmdb cmake llvm spdlog boost cmark libolm qtkeychain
```
##### Windows
#### Windows
1. Install Visual Studio 2017's "Desktop Development" and "Linux Development with C++"
1. Install Visual Studio 2022's "Desktop Development" and "Linux Development with C++"
(for the CMake integration) workloads.
2. Download the latest Qt for windows installer and install it somewhere.
Make sure to install the `MSVC 2017 64-bit` toolset for at least Qt 5.10
(lower versions does not support VS2017).
Make sure to install the `MSVC 2022 64-bit` toolset for at least Qt 5.15.
3. If you don't have openssl installed, you will need to install perl to build it (i.e. Strawberry Perl).
@ -392,7 +405,7 @@ You need to fill out the paths for the `Qt5_DIR`.
The Qt5 dir should point to the `lib\cmake\Qt5` dir.
Examples for the paths are:
- `C:\\Qt\\5.10.1\\msvc2017_64\\lib\\cmake\\Qt5`
- `C:\\Qt\\5.15.1\\msvc2017_64\\lib\\cmake\\Qt5`
You should also enable hunter by setting `HUNTER_ENABLED` to `ON` and `BUILD_SHARED_LIBS` to `OFF`.

View File

@ -1,9 +1,9 @@
---
version: 0.10.2-{build}
version: 0.11.3-{build}
configuration: Release
image: Visual Studio 2019
image: Visual Studio 2022
platform: x64
environment:
@ -23,16 +23,14 @@ build:
install:
- set QT_DIR=C:\Qt\5.15\msvc2019_64
- set PATH=Path=C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin;C:\Program Files\Git\cmd;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\PowerShell\7\;C:\Program Files\7-Zip;C:\Program Files\Microsoft\Web Platform Installer\;C:\Tools\NuGet;C:\Tools\PsTools;C:\Program Files\Git\usr\bin;C:\Program Files\Git LFS;C:\Program Files\Mercurial\;C:\Program Files (x86)\Subversion\bin;C:\Program Files\Docker\Docker\resources\bin;C:\ProgramData\DockerDesktop\version-bin;C:\Program Files\dotnet\;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\150;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin;C:\Tools\xUnit;C:\Tools\xUnit20;C:\Tools\NUnit\bin;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\Extensions\TestPlatform;C:\Ruby193\bin;C:\Tools\WebDriver;C:\Python27;C:\Python27\Scripts;C:\Program Files\erl10.7\bin;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files (x86)\Microsoft DirectX SDK;C:\Program Files\Microsoft Service Fabric\bin\Fabric\Fabric.Code;C:\Program Files\Microsoft SDKs\Service Fabric\Tools\ServiceFabricLocalClusterManager;C:\Tools\Doxygen;C:\Program Files (x86)\CMake\bin;C:\ProgramData\chocolatey\bin;C:\Tools\vcpkg;C:\Tools\Coverity\bin;C:\Program Files (x86)\NSIS;C:\Tools\Octopus;C:\Program Files\Meson\;C:\Tools\GitVersion;C:\Tools\NUnit3\bin;C:\Users\appveyor\AppData\Local\Microsoft\WindowsApps;C:\Users\appveyor\.dotnet\tools;C:\Program Files\AppVeyor\BuildAgent\
- set PATH=C:\Strawberry\perl\bin;C:\Python39-x64;%QT_DIR%\bin;%PATH%
- call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
build_script:
# VERSION format: branch-master/branch-1.2
# INSTVERSION format: x.y.z
# WINVERSION format: 9999.0.0.123/1.2.0.234
- if "%APPVEYOR_REPO_TAG%"=="false" set INSTVERSION=0.10.2
- if "%APPVEYOR_REPO_TAG%"=="false" set VERSION=0.10.2
- if "%APPVEYOR_REPO_TAG%"=="false" set INSTVERSION=0.11.3
- if "%APPVEYOR_REPO_TAG%"=="false" set VERSION=0.11.3
- if "%APPVEYOR_REPO_TAG%"=="false" if "%APPVEYOR_REPO_BRANCH%"=="master" set INSTVERSION=9999.0
- if "%APPVEYOR_REPO_TAG%"=="false" set WINVERSION=%INSTVERSION%.0.%APPVEYOR_BUILD_NUMBER%
# VERSION format: v1.2.3/v1.3.4
@ -47,13 +45,14 @@ build_script:
- echo %DATE%
# Build nheko
- cmake -G "Visual Studio 16 2019" -A x64 -H. -Bbuild
- cmake -G "Visual Studio 17 2022" -A x64 -H. -Bbuild
-DHUNTER_ROOT="C:\hunter"
-DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF -DUSE_BUNDLED_OPENSSL=ON
-DCMAKE_BUILD_TYPE=Release -DHUNTER_CONFIGURATION_TYPES=Release
- cmake --build build --config Release
- call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
- git clone https://github.com/Nheko-Reborn/qt-jdenticon.git
- cd qt-jdenticon
- qmake
@ -94,8 +93,8 @@ after_build:
- copy %BUILD%\deploy\installer\gui\package.xml installer\packages\io.github.nhekoreborn.nheko\meta
- copy %BUILD%\deploy\installer\gui\installscript.qs installer\packages\io.github.nhekoreborn.nheko\meta
# Amend version and date
- sed -i "s/__VERSION__/0.10.2/" installer\config\config.xml
- sed -i "s/__VERSION__/0.10.2/" installer\packages\io.github.nhekoreborn.nheko\meta\package.xml
- sed -i "s/__VERSION__/0.11.3/" installer\config\config.xml
- sed -i "s/__VERSION__/0.11.3/" installer\packages\io.github.nhekoreborn.nheko\meta\package.xml
- sed -i "s/__DATE__/%DATE%/" installer\packages\io.github.nhekoreborn.nheko\meta\package.xml
# Copy nheko data
- xcopy NhekoData\*.* installer\packages\io.github.nhekoreborn.nheko\data\*.* /s /e /c /y

View File

@ -2,7 +2,7 @@
# CMake module to search for the cmark library
#
include(FindPkgConfig)
find_package(PkgConfig)
pkg_check_modules(PC_CMARK QUIET cmark)
if(NOT CMARK_INCLUDE_DIR)
@ -34,9 +34,8 @@ endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(cmark
DEFAULT_MSG
CMARK_INCLUDE_DIR
CMARK_LIBRARY)
REQUIRED_VARS CMARK_LIBRARY CMARK_INCLUDE_DIR
)
mark_as_advanced(CMARK_LIBRARY CMARK_INCLUDE_DIR)

View File

@ -1,7 +1,7 @@
namespace nheko {
constexpr auto version = "${PROJECT_VERSION}";
constexpr auto build_os = "${CMAKE_HOST_SYSTEM_NAME}";
constexpr auto enable_debug_log = ${SPDLOG_DEBUG_ON};
inline constexpr auto version = "${PROJECT_VERSION}";
inline constexpr auto build_os = "${CMAKE_HOST_SYSTEM_NAME}";
inline constexpr auto enable_debug_log = ${SPDLOG_DEBUG_ON};
}
# cmakedefine01 HAVE_BACKTRACE_SYMBOLS_FD

5
default.nix Normal file
View File

@ -0,0 +1,5 @@
{ pkgs ? import <nixos> { } }:
pkgs.nheko.overrideAttrs (old: {
src = builtins.filterSource (path: type: path != "result") ./.;
})

View File

@ -1,7 +1,7 @@
id: io.github.NhekoReborn.Nheko
command: io.github.NhekoReborn.Nheko
runtime: org.kde.Platform
runtime-version: '5.15-21.08'
runtime-version: '5.15-22.08'
sdk: org.kde.Sdk
finish-args:
- --device=dri
@ -20,14 +20,27 @@ finish-args:
- --allow=per-app-dev-shm
cleanup:
- /include
- /lib/pkgconfig
- /bin/mdb*
- '*.a'
- /libexec
- /lib/cmake/
- /lib/cmake
- /bin/cmark
- /bin/event_rpcgen.py
- /bin/playout
- /bin/secret-tool
- /bin/gst-*
- /share/gdb
- /share/gst*
- /lib/girepository-1.0/
- /lib/gst-validate-launcher/
- /lib/gstreamer-1.0/include
- /lib/gstreamer-1.0/include/
- /lib/gstreamer-1.0/libgstcoreelements.so
- /lib/gstreamer-1.0/libgstopengl*
- /lib/gstreamer-1.0/libgstximagesink.so
- /lib/gstreamer-1.0/validate/
- /lib/libgst*
modules:
- name: lmdb
sources:
@ -145,6 +158,33 @@ modules:
- sha256: 1155fd1a83049767360e9a120c43c578145db3204d2b309eba49fbbedd0f4ed3
type: archive
url: https://github.com/nlohmann/json/archive/v3.10.4.tar.gz
- buildsystem: simple
build-commands:
- make static
- make prefix=/app static-install
name: re2
sources:
- sha256: f89c61410a072e5cbcf8c27e3a778da7d6fd2f2b5b1445cd4f4508bee946ab0f
type: archive
url: https://github.com/google/re2/archive/refs/tags/2022-06-01.tar.gz
- buildsystem: meson
name: gstreamer
sources:
- commit: f7806a854aad960eae3288db4a67a574f92428fe
tag: 1.20.5
type: git
url: https://gitlab.freedesktop.org/gstreamer/gstreamer.git
config-opts:
- --auto-features=disabled
- -Dgood=enabled
- -Dgst-plugins-good:qt5=enabled
- -Dqt5=enabled
- -Dbase=enabled
- -Dgst-plugins-base:gl=enabled
- -Dgst-plugins-base:gl_platform=glx,egl
- -Dgst-plugins-base:gl_winsys=x11,wayland
- -Dgst-plugins-base:x11=enabled
- -Dgst-plugins-base:xshm=enabled
- buildsystem: qmake
name: qt-jdenticon
no-make-install: true
@ -161,8 +201,8 @@ modules:
- -Ddefault_library=static
name: coeurl
sources:
- commit: cfeae3acef061dbb19706f462ee58b9be2e6ec76
tag: v0.2.1
- commit: 2a20a129240a1a017b37b6874faab499ca4e523b
tag: v0.3.0
type: git
url: https://nheko.im/nheko-reborn/coeurl.git
- config-opts:
@ -173,8 +213,8 @@ modules:
buildsystem: cmake-ninja
name: mtxclient
sources:
- commit: 42bf1fd01d5b5aca58c1b284510fc1a30d949785
tag: v0.8.2
- commit: a9a6087ae820c8fb9332422b094cab8e2301db25
tag: v0.9.2
type: git
url: https://github.com/Nheko-Reborn/mtxclient.git
- config-opts:

View File

@ -31,7 +31,27 @@ Displays help including Qt specific options.
Displays version information.
*--debug*::
Enables debug output.
Alias for _--log-level trace_.
*-l*, *--log-level* _<level>_::
Set the global log level, or a comma-separated list of _<component>=<level>_
pairs, or both. For example, to set the default log level to _warn_ but
disable logging for the _ui_ component, pass _warn,ui=off_.
+
levels: _trace_ _debug_ _info_ _warning_ _error_ _critical_ _off_
+
components: _crypto_ _db_ _mtx_ _net_ _qml_ _ui_
+
Log levels can also be set in the NHEKO_LOG_LEVEL environment variable, using
the same syntax. It will be overridden by this command line option.
*-L*, *--log-type* _<type>_::
Set the log output type. A comma-separated list is allowed. The default is _file,stderr_.
+
types: _file_ _stderr_ _none_
+
The log type can also be set in the NHEKO_LOG_TYPE environment variable,
which will be overridden by this command line option.
*-p* _<profile>_, *--profile* _<profile>_::
Creates a unique profile, which allows you to log into several accounts at the
@ -140,6 +160,12 @@ Send a message as a reaction when youre replying to a message.
*/md* _<message>_::
Force Markdown when sending the current message.
*/cmark* _<message>_::
Disables most of our extensions to cmark (CommonMark), including the
newline-in-input = newline-in-output behaviour, strikethrough and spoilers. You
may still force newlines with 2 spaces or a backslash before the line ending or
insert HTML elements.
*/plain* _<message>_::
Force plain text when sending the current message.
@ -233,6 +259,19 @@ Converts a room to a direct conversation.
*/converttoroom*::
Converts a direct conversation to a normal room.
== MARKDOWN EXTENSIONS
*newline (+\n+)*::
A single newline will be turned into `<br>` instead of a space.
*+~~text~~+*::
Make text strikethrough. HTML putput: `<del>text</del>`
*`||spoiler warning|text||`*::
Hide text and set an optional spoiler warning. Note that Nheko does not display
the spoiler warning currently. HTML output:
`<span data-mx-spoiler="spoiler">text</span>`
== FILES
*Configuration file*::

View File

@ -1,16 +1,6 @@
#compdef nheko
_arguments '--help[Displays help on commandline options.]' \
'-h[Displays help on commandline options.]' \
'--help-all[Displays help including Qt specific options.]' \
'--version[Displays version information.]' \
'-v[Displays version information.]' \
'--debug[Enables debug output.]' \
'--profile[Create or select profile.]:profile:_nheko_select_profile' \
'-p[Create or select profile.]:profile:_nheko_select_profile'
function _nheko_select_profile()
{
function _nheko_select_profile() {
local -a profiles=(default)
while read -r line; do
[[ ${line} =~ '\\auth\\device_id' ]] && profiles+=(${line%%\\*})
@ -18,6 +8,11 @@ function _nheko_select_profile()
_values "profile" ${profiles}
}
# Local Variables:
# mode: shell-script
# End:
_arguments \
{'(--help)-h','(-h)--help'}'[Displays help on commandline options.]' \
--help-all'[Displays help including Qt specific options.]' \
{'(--version)-v','(-v)--version'}'[Displays version information.]' \
--debug'[Enables debug output.]' \
{'(--log-level)-l','(-l)--log-level'}'[Set the global log level, or a comma-separated list of <component>=<level> pairs, or both.]' \
{'(--log-type)-L','(-L)--log-type'}"[Set the log output type. A comma-separated list is allowed. The default is 'file,stderr'.]" \
{'(--profile)-p','(-p)--profile'}'[Create or select profile.]':'profile':'_nheko_select_profile'

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.0"
width="32.000000pt"
height="10.000000pt"
viewBox="0 0 32.000000 10.000000"
preserveAspectRatio="xMidYMid meet"
id="svg4"
sodipodi:docname="confettiparticle.svg"
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="pt"
showgrid="false"
inkscape:zoom="17.7"
inkscape:cx="7.1751412"
inkscape:cy="0.64971751"
inkscape:window-width="1920"
inkscape:window-height="1015"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<g
transform="translate(0.000000,10.000000) scale(0.100000,-0.100000)"
fill="#000000"
stroke="none"
id="g2" />
<rect
style="fill:#ffffff;stroke-width:0.75"
id="rect307"
width="32.033897"
height="10"
x="0"
y="0" />
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -1,13 +1,13 @@
# emoji-test.txt
# Date: 2021-08-26, 17:22:23 GMT
# © 2021 Unicode®, Inc.
# Date: 2022-08-12, 20:24:39 GMT
# © 2022 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
# For terms of use, see https://www.unicode.org/terms_of_use.html
#
# Emoji Keyboard/Display Test Data for UTS #51
# Version: 14.0
# Version: 15.0
#
# For documentation and usage, see http://www.unicode.org/reports/tr51
# For documentation and usage, see https://www.unicode.org/reports/tr51
#
# This file provides data for testing which emoji forms should be in keyboards and which should also be displayed/processed.
# Format: code points; status # emoji name
@ -92,6 +92,7 @@
1F62C ; fully-qualified # 😬 E1.0 grimacing face
1F62E 200D 1F4A8 ; fully-qualified # 😮‍💨 E13.1 face exhaling
1F925 ; fully-qualified # 🤥 E3.0 lying face
1FAE8 ; fully-qualified # 🫨 E15.0 shaking face
# subgroup: face-sleepy
1F60C ; fully-qualified # 😌 E0.6 relieved face
@ -155,7 +156,7 @@
# subgroup: face-negative
1F624 ; fully-qualified # 😤 E0.6 face with steam from nose
1F621 ; fully-qualified # 😡 E0.6 pouting face
1F621 ; fully-qualified # 😡 E0.6 enraged face
1F620 ; fully-qualified # 😠 E0.6 angry face
1F92C ; fully-qualified # 🤬 E5.0 face with symbols on mouth
1F608 ; fully-qualified # 😈 E1.0 smiling face with horns
@ -190,8 +191,7 @@
1F649 ; fully-qualified # 🙉 E0.6 hear-no-evil monkey
1F64A ; fully-qualified # 🙊 E0.6 speak-no-evil monkey
# subgroup: emotion
1F48B ; fully-qualified # 💋 E0.6 kiss mark
# subgroup: heart
1F48C ; fully-qualified # 💌 E0.6 love letter
1F498 ; fully-qualified # 💘 E0.6 heart with arrow
1F49D ; fully-qualified # 💝 E0.6 heart with ribbon
@ -210,14 +210,20 @@
2764 200D 1FA79 ; unqualified # ❤‍🩹 E13.1 mending heart
2764 FE0F ; fully-qualified # ❤️ E0.6 red heart
2764 ; unqualified # ❤ E0.6 red heart
1FA77 ; fully-qualified # 🩷 E15.0 pink heart
1F9E1 ; fully-qualified # 🧡 E5.0 orange heart
1F49B ; fully-qualified # 💛 E0.6 yellow heart
1F49A ; fully-qualified # 💚 E0.6 green heart
1F499 ; fully-qualified # 💙 E0.6 blue heart
1FA75 ; fully-qualified # 🩵 E15.0 light blue heart
1F49C ; fully-qualified # 💜 E0.6 purple heart
1F90E ; fully-qualified # 🤎 E12.0 brown heart
1F5A4 ; fully-qualified # 🖤 E3.0 black heart
1FA76 ; fully-qualified # 🩶 E15.0 grey heart
1F90D ; fully-qualified # 🤍 E12.0 white heart
# subgroup: emotion
1F48B ; fully-qualified # 💋 E0.6 kiss mark
1F4AF ; fully-qualified # 💯 E0.6 hundred points
1F4A2 ; fully-qualified # 💢 E0.6 anger symbol
1F4A5 ; fully-qualified # 💥 E0.6 collision
@ -226,21 +232,20 @@
1F4A8 ; fully-qualified # 💨 E0.6 dashing away
1F573 FE0F ; fully-qualified # 🕳️ E0.7 hole
1F573 ; unqualified # 🕳 E0.7 hole
1F4A3 ; fully-qualified # 💣 E0.6 bomb
1F4AC ; fully-qualified # 💬 E0.6 speech balloon
1F441 FE0F 200D 1F5E8 FE0F ; fully-qualified # 👁️‍🗨️ E2.0 eye in speech bubble
1F441 200D 1F5E8 FE0F ; unqualified # 👁‍🗨️ E2.0 eye in speech bubble
1F441 FE0F 200D 1F5E8 ; unqualified # 👁️‍🗨 E2.0 eye in speech bubble
1F441 FE0F 200D 1F5E8 ; minimally-qualified # 👁️‍🗨 E2.0 eye in speech bubble
1F441 200D 1F5E8 ; unqualified # 👁‍🗨 E2.0 eye in speech bubble
1F5E8 FE0F ; fully-qualified # 🗨️ E2.0 left speech bubble
1F5E8 ; unqualified # 🗨 E2.0 left speech bubble
1F5EF FE0F ; fully-qualified # 🗯️ E0.7 right anger bubble
1F5EF ; unqualified # 🗯 E0.7 right anger bubble
1F4AD ; fully-qualified # 💭 E1.0 thought balloon
1F4A4 ; fully-qualified # 💤 E0.6 zzz
1F4A4 ; fully-qualified # 💤 E0.6 ZZZ
# Smileys & Emotion subtotal: 177
# Smileys & Emotion subtotal: 177 w/o modifiers
# Smileys & Emotion subtotal: 180
# Smileys & Emotion subtotal: 180 w/o modifiers
# group: People & Body
@ -300,6 +305,18 @@
1FAF4 1F3FD ; fully-qualified # 🫴🏽 E14.0 palm up hand: medium skin tone
1FAF4 1F3FE ; fully-qualified # 🫴🏾 E14.0 palm up hand: medium-dark skin tone
1FAF4 1F3FF ; fully-qualified # 🫴🏿 E14.0 palm up hand: dark skin tone
1FAF7 ; fully-qualified # 🫷 E15.0 leftwards pushing hand
1FAF7 1F3FB ; fully-qualified # 🫷🏻 E15.0 leftwards pushing hand: light skin tone
1FAF7 1F3FC ; fully-qualified # 🫷🏼 E15.0 leftwards pushing hand: medium-light skin tone
1FAF7 1F3FD ; fully-qualified # 🫷🏽 E15.0 leftwards pushing hand: medium skin tone
1FAF7 1F3FE ; fully-qualified # 🫷🏾 E15.0 leftwards pushing hand: medium-dark skin tone
1FAF7 1F3FF ; fully-qualified # 🫷🏿 E15.0 leftwards pushing hand: dark skin tone
1FAF8 ; fully-qualified # 🫸 E15.0 rightwards pushing hand
1FAF8 1F3FB ; fully-qualified # 🫸🏻 E15.0 rightwards pushing hand: light skin tone
1FAF8 1F3FC ; fully-qualified # 🫸🏼 E15.0 rightwards pushing hand: medium-light skin tone
1FAF8 1F3FD ; fully-qualified # 🫸🏽 E15.0 rightwards pushing hand: medium skin tone
1FAF8 1F3FE ; fully-qualified # 🫸🏾 E15.0 rightwards pushing hand: medium-dark skin tone
1FAF8 1F3FF ; fully-qualified # 🫸🏿 E15.0 rightwards pushing hand: dark skin tone
# subgroup: hand-fingers-partial
1F44C ; fully-qualified # 👌 E0.6 OK hand
@ -473,11 +490,11 @@
1F932 1F3FE ; fully-qualified # 🤲🏾 E5.0 palms up together: medium-dark skin tone
1F932 1F3FF ; fully-qualified # 🤲🏿 E5.0 palms up together: dark skin tone
1F91D ; fully-qualified # 🤝 E3.0 handshake
1F91D 1F3FB ; fully-qualified # 🤝🏻 E3.0 handshake: light skin tone
1F91D 1F3FC ; fully-qualified # 🤝🏼 E3.0 handshake: medium-light skin tone
1F91D 1F3FD ; fully-qualified # 🤝🏽 E3.0 handshake: medium skin tone
1F91D 1F3FE ; fully-qualified # 🤝🏾 E3.0 handshake: medium-dark skin tone
1F91D 1F3FF ; fully-qualified # 🤝🏿 E3.0 handshake: dark skin tone
1F91D 1F3FB ; fully-qualified # 🤝🏻 E14.0 handshake: light skin tone
1F91D 1F3FC ; fully-qualified # 🤝🏼 E14.0 handshake: medium-light skin tone
1F91D 1F3FD ; fully-qualified # 🤝🏽 E14.0 handshake: medium skin tone
1F91D 1F3FE ; fully-qualified # 🤝🏾 E14.0 handshake: medium-dark skin tone
1F91D 1F3FF ; fully-qualified # 🤝🏿 E14.0 handshake: dark skin tone
1FAF1 1F3FB 200D 1FAF2 1F3FC ; fully-qualified # 🫱🏻‍🫲🏼 E14.0 handshake: light skin tone, medium-light skin tone
1FAF1 1F3FB 200D 1FAF2 1F3FD ; fully-qualified # 🫱🏻‍🫲🏽 E14.0 handshake: light skin tone, medium skin tone
1FAF1 1F3FB 200D 1FAF2 1F3FE ; fully-qualified # 🫱🏻‍🫲🏾 E14.0 handshake: light skin tone, medium-dark skin tone
@ -1455,7 +1472,7 @@
1F575 1F3FF ; fully-qualified # 🕵🏿 E2.0 detective: dark skin tone
1F575 FE0F 200D 2642 FE0F ; fully-qualified # 🕵️‍♂️ E4.0 man detective
1F575 200D 2642 FE0F ; unqualified # 🕵‍♂️ E4.0 man detective
1F575 FE0F 200D 2642 ; unqualified # 🕵️‍♂ E4.0 man detective
1F575 FE0F 200D 2642 ; minimally-qualified # 🕵️‍♂ E4.0 man detective
1F575 200D 2642 ; unqualified # 🕵‍♂ E4.0 man detective
1F575 1F3FB 200D 2642 FE0F ; fully-qualified # 🕵🏻‍♂️ E4.0 man detective: light skin tone
1F575 1F3FB 200D 2642 ; minimally-qualified # 🕵🏻‍♂ E4.0 man detective: light skin tone
@ -1469,7 +1486,7 @@
1F575 1F3FF 200D 2642 ; minimally-qualified # 🕵🏿‍♂ E4.0 man detective: dark skin tone
1F575 FE0F 200D 2640 FE0F ; fully-qualified # 🕵️‍♀️ E4.0 woman detective
1F575 200D 2640 FE0F ; unqualified # 🕵‍♀️ E4.0 woman detective
1F575 FE0F 200D 2640 ; unqualified # 🕵️‍♀ E4.0 woman detective
1F575 FE0F 200D 2640 ; minimally-qualified # 🕵️‍♀ E4.0 woman detective
1F575 200D 2640 ; unqualified # 🕵‍♀ E4.0 woman detective
1F575 1F3FB 200D 2640 FE0F ; fully-qualified # 🕵🏻‍♀️ E4.0 woman detective: light skin tone
1F575 1F3FB 200D 2640 ; minimally-qualified # 🕵🏻‍♀ E4.0 woman detective: light skin tone
@ -2302,7 +2319,7 @@
1F3CC 1F3FF ; fully-qualified # 🏌🏿 E4.0 person golfing: dark skin tone
1F3CC FE0F 200D 2642 FE0F ; fully-qualified # 🏌️‍♂️ E4.0 man golfing
1F3CC 200D 2642 FE0F ; unqualified # 🏌‍♂️ E4.0 man golfing
1F3CC FE0F 200D 2642 ; unqualified # 🏌️‍♂ E4.0 man golfing
1F3CC FE0F 200D 2642 ; minimally-qualified # 🏌️‍♂ E4.0 man golfing
1F3CC 200D 2642 ; unqualified # 🏌‍♂ E4.0 man golfing
1F3CC 1F3FB 200D 2642 FE0F ; fully-qualified # 🏌🏻‍♂️ E4.0 man golfing: light skin tone
1F3CC 1F3FB 200D 2642 ; minimally-qualified # 🏌🏻‍♂ E4.0 man golfing: light skin tone
@ -2316,7 +2333,7 @@
1F3CC 1F3FF 200D 2642 ; minimally-qualified # 🏌🏿‍♂ E4.0 man golfing: dark skin tone
1F3CC FE0F 200D 2640 FE0F ; fully-qualified # 🏌️‍♀️ E4.0 woman golfing
1F3CC 200D 2640 FE0F ; unqualified # 🏌‍♀️ E4.0 woman golfing
1F3CC FE0F 200D 2640 ; unqualified # 🏌️‍♀ E4.0 woman golfing
1F3CC FE0F 200D 2640 ; minimally-qualified # 🏌️‍♀ E4.0 woman golfing
1F3CC 200D 2640 ; unqualified # 🏌‍♀ E4.0 woman golfing
1F3CC 1F3FB 200D 2640 FE0F ; fully-qualified # 🏌🏻‍♀️ E4.0 woman golfing: light skin tone
1F3CC 1F3FB 200D 2640 ; minimally-qualified # 🏌🏻‍♀ E4.0 woman golfing: light skin tone
@ -2427,7 +2444,7 @@
26F9 1F3FF ; fully-qualified # ⛹🏿 E2.0 person bouncing ball: dark skin tone
26F9 FE0F 200D 2642 FE0F ; fully-qualified # ⛹️‍♂️ E4.0 man bouncing ball
26F9 200D 2642 FE0F ; unqualified # ⛹‍♂️ E4.0 man bouncing ball
26F9 FE0F 200D 2642 ; unqualified # ⛹️‍♂ E4.0 man bouncing ball
26F9 FE0F 200D 2642 ; minimally-qualified # ⛹️‍♂ E4.0 man bouncing ball
26F9 200D 2642 ; unqualified # ⛹‍♂ E4.0 man bouncing ball
26F9 1F3FB 200D 2642 FE0F ; fully-qualified # ⛹🏻‍♂️ E4.0 man bouncing ball: light skin tone
26F9 1F3FB 200D 2642 ; minimally-qualified # ⛹🏻‍♂ E4.0 man bouncing ball: light skin tone
@ -2441,7 +2458,7 @@
26F9 1F3FF 200D 2642 ; minimally-qualified # ⛹🏿‍♂ E4.0 man bouncing ball: dark skin tone
26F9 FE0F 200D 2640 FE0F ; fully-qualified # ⛹️‍♀️ E4.0 woman bouncing ball
26F9 200D 2640 FE0F ; unqualified # ⛹‍♀️ E4.0 woman bouncing ball
26F9 FE0F 200D 2640 ; unqualified # ⛹️‍♀ E4.0 woman bouncing ball
26F9 FE0F 200D 2640 ; minimally-qualified # ⛹️‍♀ E4.0 woman bouncing ball
26F9 200D 2640 ; unqualified # ⛹‍♀ E4.0 woman bouncing ball
26F9 1F3FB 200D 2640 FE0F ; fully-qualified # ⛹🏻‍♀️ E4.0 woman bouncing ball: light skin tone
26F9 1F3FB 200D 2640 ; minimally-qualified # ⛹🏻‍♀ E4.0 woman bouncing ball: light skin tone
@ -2462,7 +2479,7 @@
1F3CB 1F3FF ; fully-qualified # 🏋🏿 E2.0 person lifting weights: dark skin tone
1F3CB FE0F 200D 2642 FE0F ; fully-qualified # 🏋️‍♂️ E4.0 man lifting weights
1F3CB 200D 2642 FE0F ; unqualified # 🏋‍♂️ E4.0 man lifting weights
1F3CB FE0F 200D 2642 ; unqualified # 🏋️‍♂ E4.0 man lifting weights
1F3CB FE0F 200D 2642 ; minimally-qualified # 🏋️‍♂ E4.0 man lifting weights
1F3CB 200D 2642 ; unqualified # 🏋‍♂ E4.0 man lifting weights
1F3CB 1F3FB 200D 2642 FE0F ; fully-qualified # 🏋🏻‍♂️ E4.0 man lifting weights: light skin tone
1F3CB 1F3FB 200D 2642 ; minimally-qualified # 🏋🏻‍♂ E4.0 man lifting weights: light skin tone
@ -2476,7 +2493,7 @@
1F3CB 1F3FF 200D 2642 ; minimally-qualified # 🏋🏿‍♂ E4.0 man lifting weights: dark skin tone
1F3CB FE0F 200D 2640 FE0F ; fully-qualified # 🏋️‍♀️ E4.0 woman lifting weights
1F3CB 200D 2640 FE0F ; unqualified # 🏋‍♀️ E4.0 woman lifting weights
1F3CB FE0F 200D 2640 ; unqualified # 🏋️‍♀ E4.0 woman lifting weights
1F3CB FE0F 200D 2640 ; minimally-qualified # 🏋️‍♀ E4.0 woman lifting weights
1F3CB 200D 2640 ; unqualified # 🏋‍♀ E4.0 woman lifting weights
1F3CB 1F3FB 200D 2640 FE0F ; fully-qualified # 🏋🏻‍♀️ E4.0 woman lifting weights: light skin tone
1F3CB 1F3FB 200D 2640 ; minimally-qualified # 🏋🏻‍♀ E4.0 woman lifting weights: light skin tone
@ -3262,8 +3279,8 @@
1FAC2 ; fully-qualified # 🫂 E13.0 people hugging
1F463 ; fully-qualified # 👣 E0.6 footprints
# People & Body subtotal: 2986
# People & Body subtotal: 506 w/o modifiers
# People & Body subtotal: 2998
# People & Body subtotal: 508 w/o modifiers
# group: Component
@ -3306,6 +3323,8 @@
1F405 ; fully-qualified # 🐅 E1.0 tiger
1F406 ; fully-qualified # 🐆 E1.0 leopard
1F434 ; fully-qualified # 🐴 E0.6 horse face
1FACE ; fully-qualified # 🫎 E15.0 moose
1FACF ; fully-qualified # 🫏 E15.0 donkey
1F40E ; fully-qualified # 🐎 E0.6 horse
1F984 ; fully-qualified # 🦄 E1.0 unicorn
1F993 ; fully-qualified # 🦓 E5.0 zebra
@ -3373,6 +3392,9 @@
1F9A9 ; fully-qualified # 🦩 E12.0 flamingo
1F99A ; fully-qualified # 🦚 E11.0 peacock
1F99C ; fully-qualified # 🦜 E11.0 parrot
1FABD ; fully-qualified # 🪽 E15.0 wing
1F426 200D 2B1B ; fully-qualified # 🐦‍⬛ E15.0 black bird
1FABF ; fully-qualified # 🪿 E15.0 goose
# subgroup: animal-amphibian
1F438 ; fully-qualified # 🐸 E0.6 frog
@ -3399,6 +3421,7 @@
1F419 ; fully-qualified # 🐙 E0.6 octopus
1F41A ; fully-qualified # 🐚 E0.6 spiral shell
1FAB8 ; fully-qualified # 🪸 E14.0 coral
1FABC ; fully-qualified # 🪼 E15.0 jellyfish
# subgroup: animal-bug
1F40C ; fully-qualified # 🐌 E0.6 snail
@ -3433,6 +3456,7 @@
1F33B ; fully-qualified # 🌻 E0.6 sunflower
1F33C ; fully-qualified # 🌼 E0.6 blossom
1F337 ; fully-qualified # 🌷 E0.6 tulip
1FABB ; fully-qualified # 🪻 E15.0 hyacinth
# subgroup: plant-other
1F331 ; fully-qualified # 🌱 E0.6 seedling
@ -3451,9 +3475,10 @@
1F343 ; fully-qualified # 🍃 E0.6 leaf fluttering in wind
1FAB9 ; fully-qualified # 🪹 E14.0 empty nest
1FABA ; fully-qualified # 🪺 E14.0 nest with eggs
1F344 ; fully-qualified # 🍄 E0.6 mushroom
# Animals & Nature subtotal: 151
# Animals & Nature subtotal: 151 w/o modifiers
# Animals & Nature subtotal: 159
# Animals & Nature subtotal: 159 w/o modifiers
# group: Food & Drink
@ -3492,10 +3517,11 @@
1F966 ; fully-qualified # 🥦 E5.0 broccoli
1F9C4 ; fully-qualified # 🧄 E12.0 garlic
1F9C5 ; fully-qualified # 🧅 E12.0 onion
1F344 ; fully-qualified # 🍄 E0.6 mushroom
1F95C ; fully-qualified # 🥜 E3.0 peanuts
1FAD8 ; fully-qualified # 🫘 E14.0 beans
1F330 ; fully-qualified # 🌰 E0.6 chestnut
1FADA ; fully-qualified # 🫚 E15.0 ginger root
1FADB ; fully-qualified # 🫛 E15.0 pea pod
# subgroup: food-prepared
1F35E ; fully-qualified # 🍞 E0.6 bread
@ -3607,8 +3633,8 @@
1FAD9 ; fully-qualified # 🫙 E14.0 jar
1F3FA ; fully-qualified # 🏺 E1.0 amphora
# Food & Drink subtotal: 134
# Food & Drink subtotal: 134 w/o modifiers
# Food & Drink subtotal: 135
# Food & Drink subtotal: 135 w/o modifiers
# group: Travel & Places
@ -3974,11 +4000,10 @@
1F3AF ; fully-qualified # 🎯 E0.6 bullseye
1FA80 ; fully-qualified # 🪀 E12.0 yo-yo
1FA81 ; fully-qualified # 🪁 E12.0 kite
1F52B ; fully-qualified # 🔫 E0.6 water pistol
1F3B1 ; fully-qualified # 🎱 E0.6 pool 8 ball
1F52E ; fully-qualified # 🔮 E0.6 crystal ball
1FA84 ; fully-qualified # 🪄 E13.0 magic wand
1F9FF ; fully-qualified # 🧿 E11.0 nazar amulet
1FAAC ; fully-qualified # 🪬 E14.0 hamsa
1F3AE ; fully-qualified # 🎮 E0.6 video game
1F579 FE0F ; fully-qualified # 🕹️ E0.7 joystick
1F579 ; unqualified # 🕹 E0.7 joystick
@ -4013,8 +4038,8 @@
1F9F6 ; fully-qualified # 🧶 E11.0 yarn
1FAA2 ; fully-qualified # 🪢 E13.0 knot
# Activities subtotal: 97
# Activities subtotal: 97 w/o modifiers
# Activities subtotal: 96
# Activities subtotal: 96 w/o modifiers
# group: Objects
@ -4040,6 +4065,7 @@
1FA73 ; fully-qualified # 🩳 E12.0 shorts
1F459 ; fully-qualified # 👙 E0.6 bikini
1F45A ; fully-qualified # 👚 E0.6 womans clothes
1FAAD ; fully-qualified # 🪭 E15.0 folding hand fan
1F45B ; fully-qualified # 👛 E0.6 purse
1F45C ; fully-qualified # 👜 E0.6 handbag
1F45D ; fully-qualified # 👝 E0.6 clutch bag
@ -4055,6 +4081,7 @@
1F461 ; fully-qualified # 👡 E0.6 womans sandal
1FA70 ; fully-qualified # 🩰 E12.0 ballet shoes
1F462 ; fully-qualified # 👢 E0.6 womans boot
1FAAE ; fully-qualified # 🪮 E15.0 hair pick
1F451 ; fully-qualified # 👑 E0.6 crown
1F452 ; fully-qualified # 👒 E0.6 womans hat
1F3A9 ; fully-qualified # 🎩 E0.6 top hat
@ -4103,6 +4130,8 @@
1FA95 ; fully-qualified # 🪕 E12.0 banjo
1F941 ; fully-qualified # 🥁 E3.0 drum
1FA98 ; fully-qualified # 🪘 E13.0 long drum
1FA87 ; fully-qualified # 🪇 E15.0 maracas
1FA88 ; fully-qualified # 🪈 E15.0 flute
# subgroup: phone
1F4F1 ; fully-qualified # 📱 E0.6 mobile phone
@ -4275,7 +4304,7 @@
1F5E1 ; unqualified # 🗡 E0.7 dagger
2694 FE0F ; fully-qualified # ⚔️ E1.0 crossed swords
2694 ; unqualified # ⚔ E1.0 crossed swords
1F52B ; fully-qualified # 🔫 E0.6 water pistol
1F4A3 ; fully-qualified # 💣 E0.6 bomb
1FA83 ; fully-qualified # 🪃 E13.0 boomerang
1F3F9 ; fully-qualified # 🏹 E1.0 bow and arrow
1F6E1 FE0F ; fully-qualified # 🛡️ E0.7 shield
@ -4354,12 +4383,14 @@
1FAA6 ; fully-qualified # 🪦 E13.0 headstone
26B1 FE0F ; fully-qualified # ⚱️ E1.0 funeral urn
26B1 ; unqualified # ⚱ E1.0 funeral urn
1F9FF ; fully-qualified # 🧿 E11.0 nazar amulet
1FAAC ; fully-qualified # 🪬 E14.0 hamsa
1F5FF ; fully-qualified # 🗿 E0.6 moai
1FAA7 ; fully-qualified # 🪧 E13.0 placard
1FAAA ; fully-qualified # 🪪 E14.0 identification card
# Objects subtotal: 304
# Objects subtotal: 304 w/o modifiers
# Objects subtotal: 310
# Objects subtotal: 310 w/o modifiers
# group: Symbols
@ -4455,6 +4486,7 @@
262E ; unqualified # ☮ E1.0 peace symbol
1F54E ; fully-qualified # 🕎 E1.0 menorah
1F52F ; fully-qualified # 🔯 E0.6 dotted six-pointed star
1FAAF ; fully-qualified # 🪯 E15.0 khanda
# subgroup: zodiac
2648 ; fully-qualified # ♈ E0.6 Aries
@ -4503,6 +4535,7 @@
1F505 ; fully-qualified # 🔅 E1.0 dim button
1F506 ; fully-qualified # 🔆 E1.0 bright button
1F4F6 ; fully-qualified # 📶 E0.6 antenna bars
1F6DC ; fully-qualified # 🛜 E15.0 wireless
1F4F3 ; fully-qualified # 📳 E0.6 vibration mode
1F4F4 ; fully-qualified # 📴 E0.6 mobile phone off
@ -4693,8 +4726,8 @@
1F533 ; fully-qualified # 🔳 E0.6 white square button
1F532 ; fully-qualified # 🔲 E0.6 black square button
# Symbols subtotal: 302
# Symbols subtotal: 302 w/o modifiers
# Symbols subtotal: 304
# Symbols subtotal: 304 w/o modifiers
# group: Flags
@ -4709,7 +4742,7 @@
1F3F3 200D 1F308 ; unqualified # 🏳‍🌈 E4.0 rainbow flag
1F3F3 FE0F 200D 26A7 FE0F ; fully-qualified # 🏳️‍⚧️ E13.0 transgender flag
1F3F3 200D 26A7 FE0F ; unqualified # 🏳‍⚧️ E13.0 transgender flag
1F3F3 FE0F 200D 26A7 ; unqualified # 🏳️‍⚧ E13.0 transgender flag
1F3F3 FE0F 200D 26A7 ; minimally-qualified # 🏳️‍⚧ E13.0 transgender flag
1F3F3 200D 26A7 ; unqualified # 🏳‍⚧ E13.0 transgender flag
1F3F4 200D 2620 FE0F ; fully-qualified # 🏴‍☠️ E11.0 pirate flag
1F3F4 200D 2620 ; minimally-qualified # 🏴‍☠ E11.0 pirate flag
@ -4983,9 +5016,9 @@
# Flags subtotal: 275 w/o modifiers
# Status Counts
# fully-qualified : 3624
# minimally-qualified : 817
# unqualified : 252
# fully-qualified : 3655
# minimally-qualified : 827
# unqualified : 242
# component : 9
#EOF

View File

@ -0,0 +1 @@
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M3.28 2.22a.75.75 0 1 0-1.06 1.06l2.788 2.788a3.3 3.3 0 0 0-.005.181v14.996a.75.75 0 0 0 1.188.609L12 17.673l5.812 4.18A.75.75 0 0 0 19 21.246v-1.183l1.718 1.718a.75.75 0 0 0 1.061-1.06L3.28 2.22Zm14.221 16.342v1.22L12.44 16.14a.75.75 0 0 0-.876 0l-5.061 3.642V7.563L17.5 18.562ZM17.501 6.25v8.07l1.5 1.5V6.25A3.25 3.25 0 0 0 15.751 3H8.253c-.595 0-1.153.16-1.633.438l1.133 1.133a1.75 1.75 0 0 1 .5-.072h7.498c.967 0 1.75.784 1.75 1.75Z" fill="#212121"/></svg>

After

Width:  |  Height:  |  Size: 564 B

View File

@ -0,0 +1 @@
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6.19 21.854a.75.75 0 0 1-1.188-.61V6.25a3.25 3.25 0 0 1 3.25-3.25h7.499A3.25 3.25 0 0 1 19 6.249v14.996a.75.75 0 0 1-1.188.609l-5.811-4.181-5.812 4.18ZM17.5 6.249a1.75 1.75 0 0 0-1.75-1.75H8.253a1.75 1.75 0 0 0-1.75 1.75v13.532l5.062-3.64a.75.75 0 0 1 .876 0l5.06 3.64V6.25Z" fill="#212121"/></svg>

After

Width:  |  Height:  |  Size: 403 B

View File

@ -0,0 +1,4 @@
<svg width="96" height="96" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M7 18h13a.75.75 0 0 1 .102 1.493L20 19.5H7a.75.75 0 0 1-.102-1.493L7 18Zm10-3a.75.75 0 0 1 .102 1.493L17 16.5H4a.75.75 0 0 1-.102-1.493L4 15h13Zm3-3a.75.75 0 0 1 .102 1.493L20 13.5H7a.75.75 0 0 1-.102-1.493L7 12h13ZM6 5a2.75 2.75 0 0 1 2.55 1.717.75.75 0 0 1-1.346.655l-.045-.091A1.25 1.25 0 1 0 6 9h11.5a.75.75 0 0 1 .102 1.493l-.102.007H6A2.75 2.75 0 0 1 6 5Zm14 1a.75.75 0 0 1 .102 1.493L20 7.5h-9a.75.75 0 0 1-.102-1.493L11 6h9Z" fill="#212121"/>
<path d="m3.2035 3.2035c0.29289-0.2929 0.76777-0.2929 1.0607 0 16.532 16.532 0 0 16.532 16.532 0.29295 0.29288 0.29295 0.76778 0 1.0606-0.29288 0.29288-0.7677 0.29288-1.0606 0-16.532-16.532-0.11015-0.11011-16.532-16.532-0.2929-0.29289-0.2929-0.76777 1e-7 -1.0607z" fill="#212121" stroke-width=".75"/>
</svg>

After

Width:  |  Height:  |  Size: 868 B

View File

@ -0,0 +1,6 @@
<svg width="32" height="32" version="1.1" viewBox="0 0 8.4667 8.4667" xmlns="http://www.w3.org/2000/svg">
<g transform="rotate(17.066 .26297 6.1037)" stroke="#000" stroke-linejoin="round">
<path d="m1.0583 0.26458c-0.79375 0-0.79375 0.79375-0.79375 0.79375l0.79375 6.35 0.79375-6.35s-9e-7 -0.79375-0.79375-0.79375zm0 0.26458a0.52917 0.52917 0 0 1 0.52917 0.52917 0.52917 0.52917 0 0 1-0.52917 0.52917 0.52917 0.52917 0 0 1-0.52917-0.52917 0.52917 0.52917 0 0 1 0.52917-0.52917z" fill-rule="evenodd" stroke-width=".026458"/>
<path d="m1.0583 1.0583s4.4594-1.5552 5.2917 0c0.60018 1.1215-2.242 1.9092-2.1167 3.175 0.049161 0.49648 1.0583 0.55943 1.0583 1.0583s-1.0583 1.0583-1.0583 1.0583" fill="none" stroke-linecap="round" stroke-width=".52917"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 765 B

View File

@ -0,0 +1 @@
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M17.5 12a5.5 5.5 0 1 1 0 11 5.5 5.5 0 0 1 0-11Zm0 2-.09.007a.5.5 0 0 0-.402.402L17 14.5V17L14.498 17l-.09.008a.5.5 0 0 0-.402.402l-.008.09.008.09a.5.5 0 0 0 .402.402l.09.008H17v2.503l.008.09a.5.5 0 0 0 .402.402l.09.008.09-.008a.5.5 0 0 0 .402-.402l.008-.09V18l2.504.001.09-.008a.5.5 0 0 0 .402-.402l.008-.09-.008-.09a.5.5 0 0 0-.403-.402l-.09-.008H18v-2.5l-.008-.09a.5.5 0 0 0-.402-.403L17.5 14Zm-6.481 4c.04.519.14 1.021.294 1.5H7a.75.75 0 0 1-.102-1.493L7 18h4.019Zm.479-3c-.198.475-.34.977-.422 1.5H4a.75.75 0 0 1-.102-1.493L4 15h7.498Zm2.537-3a6.534 6.534 0 0 0-1.659 1.5H7a.75.75 0 0 1-.102-1.493L7 12h7.035ZM6 5a2.75 2.75 0 0 1 2.55 1.717.75.75 0 0 1-1.346.655l-.045-.091A1.25 1.25 0 1 0 6 9h11.5a.75.75 0 0 1 .102 1.493l-.102.007H6A2.75 2.75 0 0 1 6 5Zm14 1a.75.75 0 0 1 .102 1.493L20 7.5h-9a.75.75 0 0 1-.102-1.493L11 6h9Z" fill="#212121"/></svg>

After

Width:  |  Height:  |  Size: 958 B

View File

@ -0,0 +1 @@
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M17.5 12a5.5 5.5 0 1 1 0 11 5.5 5.5 0 0 1 0-11ZM12 2c5.524 0 10.002 4.478 10.002 10.002 0 .263-.01.524-.03.782a6.507 6.507 0 0 0-1.475-1.052 8.501 8.501 0 1 0-8.765 8.767 6.5 6.5 0 0 0 1.05 1.474c-.257.02-.518.03-.782.03-5.524 0-10.002-4.478-10.002-10.001C1.998 6.477 6.476 1.999 12 1.999Zm5.5 12-.09.008a.5.5 0 0 0-.402.402L17 14.5V17L14.498 17l-.09.008a.5.5 0 0 0-.402.402l-.008.09.008.09a.5.5 0 0 0 .402.402l.09.008H17v2.503l.008.09a.5.5 0 0 0 .402.402l.09.008.09-.008a.5.5 0 0 0 .402-.402l.008-.09V18l2.504.001.09-.008a.5.5 0 0 0 .402-.402l.008-.09-.008-.09a.5.5 0 0 0-.402-.402l-.09-.008H18v-2.5l-.008-.09a.5.5 0 0 0-.402-.403L17.5 14Zm-9.038.785a4.494 4.494 0 0 0 2.63 1.626 6.449 6.449 0 0 0-.079 1.51 5.983 5.983 0 0 1-3.73-2.208.75.75 0 0 1 1.179-.928ZM9 8.75a1.25 1.25 0 1 1 0 2.499A1.25 1.25 0 0 1 9 8.75Zm6 0a1.25 1.25 0 1 1 0 2.499 1.25 1.25 0 0 1 0-2.499Z" fill="#212121"/></svg>

After

Width:  |  Height:  |  Size: 997 B

View File

@ -0,0 +1 @@
<svg width="96" height="96" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M7 18h13a.75.75 0 0 1 .102 1.493L20 19.5H7a.75.75 0 0 1-.102-1.493L7 18Zm10-3a.75.75 0 0 1 .102 1.493L17 16.5H4a.75.75 0 0 1-.102-1.493L4 15h13Zm3-3a.75.75 0 0 1 .102 1.493L20 13.5H7a.75.75 0 0 1-.102-1.493L7 12h13ZM6 5a2.75 2.75 0 0 1 2.55 1.717.75.75 0 0 1-1.346.655l-.045-.091A1.25 1.25 0 1 0 6 9h11.5a.75.75 0 0 1 .102 1.493l-.102.007H6A2.75 2.75 0 0 1 6 5Zm14 1a.75.75 0 0 1 .102 1.493L20 7.5h-9a.75.75 0 0 1-.102-1.493L11 6h9Z" fill="#212121"/></svg>

After

Width:  |  Height:  |  Size: 561 B

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

5102
resources/langs/nheko_ie.ts Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

5120
resources/langs/nheko_uk.ts Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -61,6 +61,10 @@
<url type="homepage">https://github.com/Nheko-Reborn/nheko</url>
<update_contact>https://github.com/Nheko-Reborn</update_contact>
<releases>
<release date="2023-02-23" version="0.11.3"/>
<release date="2023-02-20" version="0.11.2"/>
<release date="2023-01-15" version="0.11.1"/>
<release date="2023-01-12" version="0.11.0"/>
<release date="2022-09-28" version="0.10.2"/>
<release date="2022-09-07" version="0.10.1"/>
<release date="2022-07-22" version="0.10.0"/>

View File

@ -7,4 +7,12 @@
using namespace emoji;
// a null terminated string_view
template<size_t N>
static consteval std::u16string_view
null_literal(const char16_t (&lit)[N])
{
return std::u16string_view(lit, N);
}

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -24,8 +25,8 @@ AbstractButton {
height: 48
background: Rectangle {
id: bg
radius: Settings.avatarCircles ? height / 2 : height / 8
color: Nheko.colors.alternateBase
radius: Settings.avatarCircles ? height / 2 : 0
color: Nheko.colors.dark
}
Label {
@ -48,7 +49,7 @@ AbstractButton {
anchors.fill: parent
visible: Settings.useIdenticon && img.status != Image.Ready
source: Settings.useIdenticon ? ("image://jdenticon/" + (userid !== "" ? userid : roomid) + "?radius=" + (Settings.avatarCircles ? 100 : 25)) : ""
source: Settings.useIdenticon ? ("image://jdenticon/" + (userid !== "" ? userid : roomid) + "?radius=" + (Settings.avatarCircles ? 100 : 0)) : ""
}
Image {
@ -61,7 +62,7 @@ AbstractButton {
smooth: true
sourceSize.width: avatar.width * Screen.devicePixelRatio
sourceSize.height: avatar.height * Screen.devicePixelRatio
source: avatar.url ? (avatar.url + "?radius=" + (Settings.avatarCircles ? 100 : 25) + ((avatar.crop) ? "" : "&scale")) : ""
source: avatar.url ? (avatar.url + "?radius=" + (Settings.avatarCircles ? 100 : 0) + ((avatar.crop) ? "" : "&scale")) : ""
}
@ -73,15 +74,15 @@ AbstractButton {
visible: !!userid
height: avatar.height / 6
width: height
radius: Settings.avatarCircles ? height / 2 : height / 8
radius: Settings.avatarCircles ? height / 2 : 0
color: updatePresence()
function updatePresence() {
switch (Presence.userPresence(userid)) {
case "online":
return "#00cc66";
return Nheko.theme.online;
case "unavailable":
return "#ff9933";
return Nheko.theme.unavailable;
case "offline":
default:
// return "#a82353" don't show anything if offline, since it is confusing, if presence is disabled

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -122,7 +123,7 @@ Rectangle {
AdaptiveLayoutElement {
id: timlineViewC
minimumWidth: fontMetrics.averageCharacterWidth * 40 + Nheko.avatarSize + 2 * Nheko.paddingMedium
minimumWidth: fontMetrics.height/2 * 40 + Nheko.avatarSize + 2 * Nheko.paddingMedium
TimelineView {
id: timeline

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -19,6 +20,14 @@ Page {
property int avatarSize: Math.ceil(fontMetrics.lineSpacing * 1.6)
property bool collapsed: false
// HACK: https://bugreports.qt.io/browse/QTBUG-83972, qtwayland cannot auto hide menu
Connections {
function onHideMenu() {
communityContextMenu.close()
}
target: MainWindow
}
ListView {
id: communitiesList
@ -27,6 +36,11 @@ Page {
height: parent.height
model: Communities.filtered()
ScrollBar.vertical: ScrollBar {
id: scrollbar
parent: !collapsed && Settings.scrollbarsInRoomlist ? communitiesList : null
}
ScrollHelper {
flickable: parent
anchors.fill: parent
@ -48,14 +62,14 @@ Page {
}
Platform.MenuItem {
text: qsTr("Do not show notification counts for this space or tag.")
text: qsTr("Do not show notification counts for this community or tag.")
checkable: true
checked: communityContextMenu.muted
onTriggered: Communities.toggleTagMute(communityContextMenu.tagId)
}
Platform.MenuItem {
text: qsTr("Hide rooms with this tag or from this space by default.")
text: qsTr("Hide rooms with this tag or from this community by default.")
checkable: true
checked: communityContextMenu.hidden
onTriggered: Communities.toggleTagId(communityContextMenu.tagId)
@ -74,7 +88,7 @@ Page {
required property var model
height: avatarSize + 2 * Nheko.paddingMedium
width: ListView.view.width
width: ListView.view.width - ((scrollbar.interactive && scrollbar.visible && scrollbar.parent) ? scrollbar.width : 0)
state: "normal"
ToolTip.visible: hovered && collapsed
ToolTip.text: model.tooltip

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -120,6 +121,9 @@ Control {
pixelAligned: true
highlightFollowsCurrentItem: true
displayMarginBeginning: height / 2
displayMarginEnd: height / 2
delegate: Rectangle {
property variant modelData: model
@ -209,6 +213,30 @@ Control {
}
DelegateChoice {
roleValue: "command"
RowLayout {
id: del
anchors.centerIn: parent
spacing: rowSpacing
Label {
text: model.name
color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.text
font.bold: true
}
Label {
text: model.description
color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.buttonText
}
}
}
DelegateChoice {
roleValue: "customEmoji"
@ -263,7 +291,7 @@ Control {
Label {
text: model.roomName
font.pixelSize: popup.avatarHeight * 0.5
color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.text
color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.brightText
textFormat: Text.RichText
}

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -15,7 +16,7 @@ Label {
property int fullTextWidth: Math.ceil(metrics.advanceWidth)
color: Nheko.colors.text
text: (textFormat == Text.PlainText) ? metrics.elidedText : TimelineManager.escapeEmoji(TimelineManager.htmlEscape(metrics.elidedText))
text: (textFormat == Text.PlainText) ? metrics.elidedText : TimelineManager.escapeEmoji(metrics.elidedText)
maximumLineCount: 1
elide: Text.ElideRight
textFormat: Text.PlainText

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -34,13 +35,13 @@ Image {
width: 16
height: 16
sourceSize.height: height * Screen.devicePixelRatio
sourceSize.width: width * Screen.devicePixelRatio
sourceSize.height: height
sourceSize.width: width
source: {
if (encrypted) {
switch (trust) {
case Crypto.Verified:
return sourceUrl + "green";
return sourceUrl + Nheko.theme.green;
case Crypto.TOFU:
return sourceUrl + Nheko.colors.buttonText;
default:

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -20,6 +21,7 @@ ColumnLayout {
property alias font: input.font
property alias echoMode: input.echoMode
property alias selectByMouse: input.selectByMouse
property var hasClear: false
Timer {
id: timer
@ -129,6 +131,26 @@ ColumnLayout {
color: labelC.text ? "transparent" : backgroundColor
}
ImageButton {
id: clearText
visible: c.hasClear && searchField.text !== ''
image: ":/icons/icons/ui/round-remove-button.svg"
focusPolicy: Qt.NoFocus
onClicked: {
searchField.clear()
topBar.searchString = "";
}
hoverEnabled: true
anchors {
top: parent.top
bottom: parent.bottom
right: parent.right
rightMargin: Nheko.paddingSmall
}
}
}
Rectangle {

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -14,7 +15,7 @@ import im.nheko 1.0
Rectangle {
id: inputBar
color: Nheko.colors.window
color: Nheko.colors.base
Layout.fillWidth: true
Layout.preferredHeight: row.implicitHeight
Layout.minimumHeight: 40
@ -46,14 +47,14 @@ Rectangle {
ImageButton {
visible: CallManager.callsSupported && showAllButtons
opacity: CallManager.haveCallInvite ? 0.3 : 1
opacity: (CallManager.haveCallInvite || CallManager.isOnCallOnOtherDevice) ? 0.3 : 1
Layout.alignment: Qt.AlignBottom
hoverEnabled: true
width: 22
height: 22
image: CallManager.isOnCall ? ":/icons/icons/ui/end-call.svg" : ":/icons/icons/ui/place-call.svg"
ToolTip.visible: hovered
ToolTip.text: CallManager.isOnCall ? qsTr("Hang up") : qsTr("Place a call")
ToolTip.text: CallManager.isOnCall ? qsTr("Hang up") : (CallManager.isOnCallOnOtherDevice ? qsTr("Already on a call") : qsTr("Place a call"))
Layout.margins: 8
onClicked: {
if (room) {
@ -61,7 +62,11 @@ Rectangle {
return ;
} else if (CallManager.isOnCall) {
CallManager.hangUp();
} else {
}
else if(CallManager.isOnCallOnOtherDevice) {
return;
}
else {
var dialog = placeCallDialog.createObject(timelineRoot);
dialog.open();
timelineRoot.destroyOnClose(dialog);
@ -164,6 +169,8 @@ Rectangle {
messageInput.openCompleter(selectionStart-1, "roomAliases");
} else if (lastChar == "~") {
messageInput.openCompleter(selectionStart-1, "customEmoji");
} else if (lastChar == "/" && cursorPosition == 1) {
messageInput.openCompleter(selectionStart-1, "command");
}
}
onCursorPositionChanged: {
@ -212,6 +219,11 @@ Rectangle {
popup.close();
} else if (event.matches(StandardKey.InsertLineSeparator)) {
if (popup.opened) popup.close();
if (Settings.invertEnterKey && (!Qt.inputMethod.visible || Qt.platform.os === "windows")) {
room.input.send();
event.accepted = true;
}
} else if (event.matches(StandardKey.InsertParagraphSeparator)) {
if (popup.opened) {
var currentCompletion = completer.currentCompletion();
@ -223,7 +235,7 @@ Rectangle {
return;
}
}
if (!Qt.inputMethod.visible) {
if (!Settings.invertEnterKey && (!Qt.inputMethod.visible || Qt.platform.os === "windows")) {
room.input.send();
event.accepted = true;
}
@ -378,6 +390,10 @@ Rectangle {
messageInput.forceActiveFocus();
}
function onThreadChanged() {
messageInput.forceActiveFocus();
}
ignoreUnknownSignals: true
target: room
}
@ -404,7 +420,7 @@ Rectangle {
ImageButton {
id: stickerButton
visible: showAllButtons
visible: false
Layout.alignment: Qt.AlignRight | Qt.AlignBottom
Layout.margins: 8

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -22,6 +23,17 @@ Item {
property int availableWidth: width
property string searchString: ""
// HACK: https://bugreports.qt.io/browse/QTBUG-83972, qtwayland cannot auto hide menu
Connections {
function onHideMenu() {
messageContextMenu.close()
replyContextMenu.close()
}
target: MainWindow
}
ScrollBar {
id: scrollbar
parent: chat.parent
@ -36,24 +48,34 @@ Item {
property int delegateMaxWidth: ((Settings.timelineMaxWidth > 100 && Settings.timelineMaxWidth < chatRoot.availableWidth) ? Settings.timelineMaxWidth : chatRoot.availableWidth) - chatRoot.padding * 2 - (scrollbar.interactive? scrollbar.width : 0)
readonly property alias filteringInProgress: filteredTimeline.filteringInProgress
displayMarginBeginning: height / 2
displayMarginEnd: height / 2
model: room
TimelineFilter {
id: filteredTimeline
source: room
filterByThread: room ? room.thread : ""
filterByContent: chatRoot.searchString
}
model: (filteredTimeline.filterByThread || filteredTimeline.filterByContent) ? filteredTimeline : room
// reuseItems still has a few bugs, see https://bugreports.qt.io/browse/QTBUG-95105 https://bugreports.qt.io/browse/QTBUG-95107
//onModelChanged: if (room) room.sendReset()
//reuseItems: true
boundsBehavior: Flickable.StopAtBounds
//pixelAligned: true
spacing: 2
spacing: 16
verticalLayoutDirection: ListView.BottomToTop
onCountChanged: {
// Mark timeline as read
if (atYEnd && room) model.currentIndex = 0;
}
ScrollBar.vertical: scrollbar
anchors.leftMargin: 16
anchors.rightMargin: scrollbar.interactive? scrollbar.width : 0
Control {
@ -75,7 +97,7 @@ Item {
color: Nheko.colors.window
border.color: Nheko.colors.buttonText
border.width: 1
radius: padding
radius: 0
}
contentItem: RowLayout {
@ -91,7 +113,7 @@ Item {
delegate: TextButton {
required property string modelData
visible: chat.model ? chat.model.permissions.canSend(MtxEvent.Reaction) : false
visible: room ? room.permissions.canSend(MtxEvent.Reaction) : false
Layout.preferredHeight: fontMetrics.height
font.family: Settings.emojiFont
@ -116,19 +138,17 @@ Item {
ToolTip.delay: Nheko.tooltipDelay
ToolTip.text: qsTr("Edit")
onClicked: {
if (row.model.isEditable)
chat.model.editAction(row.model.eventId);
if (row.model.isEditable) room.edit = row.model.eventId;
}
}
ImageButton {
id: reactButton
visible: chat.model ? chat.model.permissions.canSend(MtxEvent.Reaction) : false
visible: room ? room.permissions.canSend(MtxEvent.Reaction) : false
width: 16
hoverEnabled: true
image: ":/icons/icons/ui/smile.svg"
image: ":/icons/icons/ui/smile-add.svg"
ToolTip.visible: hovered
ToolTip.delay: Nheko.tooltipDelay
ToolTip.text: qsTr("React")
@ -139,17 +159,30 @@ Item {
})
}
ImageButton {
id: threadButton
visible: room ? room.permissions.canSend(MtxEvent.TextMessage) : false
width: 16
hoverEnabled: true
image: (row.model && row.model.threadId) ? ":/icons/icons/ui/thread.svg" : ":/icons/icons/ui/new-thread.svg"
ToolTip.visible: hovered
ToolTip.delay: Nheko.tooltipDelay
ToolTip.text: (row.model && row.model.threadId) ? qsTr("Reply in thread") : qsTr("New thread")
onClicked: room.thread = (row.model.threadId || row.model.eventId)
}
ImageButton {
id: replyButton
visible: chat.model ? chat.model.permissions.canSend(MtxEvent.TextMessage) : false
visible: room ? room.permissions.canSend(MtxEvent.TextMessage) : false
width: 16
hoverEnabled: true
image: ":/icons/icons/ui/reply.svg"
ToolTip.visible: hovered
ToolTip.delay: Nheko.tooltipDelay
ToolTip.text: qsTr("Reply")
onClicked: chat.model.replyAction(row.model.eventId)
onClicked: room.reply = row.model.eventId
}
ImageButton {
@ -161,7 +194,7 @@ Item {
ToolTip.visible: hovered
ToolTip.delay: Nheko.tooltipDelay
ToolTip.text: qsTr("Options")
onClicked: messageContextMenu.show(row.model.eventId, row.model.type, row.model.isSender, row.model.isEncrypted, row.model.isEditable, "", row.model.body, optionsButton)
onClicked: messageContextMenu.show(row.model.eventId, row.model.threadId, row.model.type, row.model.isSender, row.model.isEncrypted, row.model.isEditable, "", row.model.body, optionsButton)
}
}
@ -194,35 +227,39 @@ Item {
onActivated: {
if(room.input.uploads.length > 0)
room.input.declineUploads();
else if(chat.model.reply)
chat.model.reply = undefined;
else if(room.reply)
room.reply = undefined;
else if (room.edit)
room.edit = undefined;
else
chat.model.edit = undefined;
room.thread = undefined
TimelineManager.focusMessageInput();
}
}
// These shortcuts use the room timeline because switching to threads and out is annoying otherwise.
// Better solution welcome.
Shortcut {
sequence: "Alt+Up"
onActivated: chat.model.reply = chat.model.indexToId(chat.model.reply ? chat.model.idToIndex(chat.model.reply) + 1 : 0)
onActivated: room.reply = room.indexToId(room.reply ? room.idToIndex(room.reply) + 1 : 0)
}
Shortcut {
sequence: "Alt+Down"
onActivated: {
var idx = chat.model.reply ? chat.model.idToIndex(chat.model.reply) - 1 : -1;
chat.model.reply = idx >= 0 ? chat.model.indexToId(idx) : null;
var idx = room.reply ? room.idToIndex(room.reply) - 1 : -1;
room.reply = idx >= 0 ? room.indexToId(idx) : null;
}
}
Shortcut {
sequence: "Alt+F"
onActivated: {
if (chat.model.reply) {
if (room.reply) {
var forwardMess = forwardCompleterComponent.createObject(timelineRoot);
forwardMess.setMessageEventId(chat.model.reply);
forwardMess.setMessageEventId(room.reply);
forwardMess.open();
chat.model.reply = null;
room.reply = null;
timelineRoot.destroyOnClose(forwardMess);
}
}
@ -231,7 +268,7 @@ Item {
Shortcut {
sequence: "Ctrl+E"
onActivated: {
chat.model.edit = chat.model.reply;
room.edit = room.reply;
}
}
@ -242,8 +279,8 @@ Item {
// force current read index to update
onTriggered: {
if (chat.model)
chat.model.setCurrentIndex(chat.model.currentIndex);
if (room)
room.setCurrentIndex(room.currentIndex);
}
interval: 1000
@ -266,15 +303,15 @@ Item {
anchors.horizontalCenter: parent ? parent.horizontalCenter : undefined
visible: room && previousMessageDay !== day
text: room ? room.formatDateSeparator(timestamp) : ""
color: Nheko.colors.text
height: Math.round(fontMetrics.height * 1.4)
color: Nheko.colors.brightText
height: Math.round(fontMetrics.height * 2)
width: contentWidth * 1.2
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
background: Rectangle {
radius: parent.height / 2
color: Nheko.colors.window
radius: 0
color: Nheko.colors.base
}
}
@ -301,14 +338,14 @@ Item {
Connections {
function onRoomAvatarUrlChanged() {
messageUserAvatar.url = chat.model.avatarUrl(userId).replace("mxc://", "image://MxcImage/");
messageUserAvatar.url = room.avatarUrl(userId).replace("mxc://", "image://MxcImage/");
}
function onScrollToIndex(index) {
chat.positionViewAtIndex(index, ListView.Center);
}
target: chat.model
target: room
}
property int remainingWidth: chat.delegateMaxWidth - spacing - messageUserAvatar.width
AbstractButton {
@ -322,7 +359,7 @@ Item {
ToolTip.visible: hovered
ToolTip.delay: Nheko.tooltipDelay
ToolTip.text: userId
onClicked: chat.model.openUserProfile(userId)
onClicked: room.openUserProfile(userId)
leftInset: 0
rightInset: 0
leftPadding: 0
@ -381,24 +418,26 @@ Item {
required property bool isEditable
required property bool isEdited
required property bool isStateEvent
required property bool previousMessageIsStateEvent
property bool previousMessageIsStateEvent: (index + 1) >= chat.count ? true : chat.model.dataByIndex(index+1, Room.IsStateEvent)
required property string replyTo
required property string threadId
required property string userId
required property string roomTopic
required property string roomName
required property string callType
required property var reactions
required property int trustlevel
required property int notificationlevel
required property int encryptionError
required property var timestamp
required property int status
required property int index
required property int relatedEventCacheBuster
required property string previousMessageUserId
required property string day
required property string previousMessageDay
required property var day
property string previousMessageUserId: (index + 1) >= chat.count ? "" : chat.model.dataByIndex(index+1, Room.UserId)
property var previousMessageDay: (index + 1) >= chat.count ? 0 : chat.model.dataByIndex(index+1, Room.Day)
required property string userName
property bool scrolledToThis: eventId === chat.model.scrollTarget && (y + height > chat.y + chat.contentY && y < chat.y + chat.height + chat.contentY)
property bool scrolledToThis: eventId === room.scrollTarget && (y + height > chat.y + chat.contentY && y < chat.y + chat.height + chat.contentY)
anchors.horizontalCenter: parent ? parent.horizontalCenter : undefined
width: chat.delegateMaxWidth
@ -410,8 +449,8 @@ Item {
property int parentWidth: parent.width
property string userId: wrapper.userId
property string previousMessageUserId: wrapper.previousMessageUserId
property string day: wrapper.day
property string previousMessageDay: wrapper.previousMessageDay
property var day: wrapper.day
property var previousMessageDay: wrapper.previousMessageDay
property bool previousMessageIsStateEvent: wrapper.previousMessageIsStateEvent
property bool isStateEvent: wrapper.isStateEvent
property bool isSender: wrapper.isSender
@ -419,7 +458,7 @@ Item {
property date timestamp: wrapper.timestamp
z: 4
active: previousMessageUserId !== undefined && previousMessageUserId !== userId || previousMessageDay !== day || previousMessageIsStateEvent !== isStateEvent
active: previousMessageUserId !== userId || previousMessageDay !== day || previousMessageIsStateEvent !== isStateEvent
//asynchronous: true
sourceComponent: sectionHeader
visible: status == Loader.Ready
@ -448,6 +487,7 @@ Item {
isEdited: wrapper.isEdited
isStateEvent: wrapper.isStateEvent
replyTo: wrapper.replyTo
threadId: wrapper.threadId
userId: wrapper.userId
userName: wrapper.userName
roomTopic: wrapper.roomTopic
@ -455,9 +495,11 @@ Item {
callType: wrapper.callType
reactions: wrapper.reactions
trustlevel: wrapper.trustlevel
notificationlevel: wrapper.notificationlevel
encryptionError: wrapper.encryptionError
timestamp: wrapper.timestamp
status: wrapper.status
index: wrapper.index
relatedEventCacheBuster: wrapper.relatedEventCacheBuster
y: section.visible && section.active ? section.y + section.height : 0
@ -507,7 +549,7 @@ Item {
}
ScriptAction {
script: chat.model.eventShown()
script: room.eventShown()
}
}
@ -532,7 +574,7 @@ Item {
footer: Item {
anchors.horizontalCenter: parent.horizontalCenter
anchors.margins: Nheko.paddingLarge
visible: chat.model && chat.model.paginationInProgress
visible: (room && room.paginationInProgress) || chat.filteringInProgress
// hacky, but works
height: loadingSpinner.height + 2 * Nheko.paddingLarge
@ -541,7 +583,7 @@ Item {
anchors.centerIn: parent
anchors.margins: Nheko.paddingLarge
running: chat.model && chat.model.paginationInProgress
running: (room && room.paginationInProgress) || chat.filteringInProgress
foreground: Nheko.colors.mid
z: 3
}
@ -553,6 +595,7 @@ Item {
id: messageContextMenu
property string eventId
property string threadId
property string link
property string text
property int eventType
@ -560,8 +603,9 @@ Item {
property bool isEditable
property bool isSender
function show(eventId_, eventType_, isSender_, isEncrypted_, isEditable_, link_, text_, showAt_) {
function show(eventId_, threadId_, eventType_, isSender_, isEncrypted_, isEditable_, link_, text_, showAt_) {
eventId = eventId_;
threadId = threadId_;
eventType = eventType_;
isEncrypted = isEncrypted_;
isEditable = isEditable_;
@ -622,14 +666,21 @@ Item {
Platform.MenuItem {
visible: room ? room.permissions.canSend(MtxEvent.TextMessage) : false
text: qsTr("Repl&y")
onTriggered: room.replyAction(messageContextMenu.eventId)
onTriggered: room.reply = (messageContextMenu.eventId)
}
Platform.MenuItem {
visible: messageContextMenu.isEditable && (room ? room.permissions.canSend(MtxEvent.TextMessage) : false)
enabled: visible
text: qsTr("&Edit")
onTriggered: room.editAction(messageContextMenu.eventId)
onTriggered: room.edit = (messageContextMenu.eventId)
}
Platform.MenuItem {
visible: (room ? room.permissions.canSend(MtxEvent.TextMessage) : false)
enabled: visible
text: qsTr("&Thread")
onTriggered: room.thread = (messageContextMenu.threadId || messageContextMenu.eventId)
}
Platform.MenuItem {
@ -640,7 +691,7 @@ Item {
}
Platform.MenuItem {
text: qsTr("Read receip&ts")
text: qsTr("&Read receipts")
onTriggered: room.showReadReceipts(messageContextMenu.eventId)
}
@ -747,7 +798,7 @@ Item {
visible: true
enabled: visible
text: qsTr("&Go to quoted message")
onTriggered: chat.model.showEvent(replyContextMenu.eventId)
onTriggered: room.showEvent(replyContextMenu.eventId)
}
}
@ -762,7 +813,7 @@ Item {
property int fullWidth: 40
width: 0
height: width
radius: width/2
radius: 0
onClicked: chat.positionViewAtBeginning();
flat: true
hoverEnabled: true
@ -772,7 +823,7 @@ Item {
opacity: enabled ? 1 : 0.3
border.color: toEndButton.hovered ? Nheko.colors.highlight : Nheko.colors.buttonText
border.width: 1
radius: toEndButton.radius
radius: 0
}
states: [

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -39,12 +40,12 @@ BusyIndicator {
Rectangle {
implicitWidth: radius * 2
implicitHeight: radius * 2
radius: item.height / 6
radius: 0
color: Nheko.colors.text
opacity: (index + 2) / (repeater.count + 2)
transform: [
Translate {
y: -Math.min(item.width, item.height) * 0.5 + item.height / 6
y: item.height / 2
},
Rotation {
angle: index / repeater.count * 360

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -127,7 +128,7 @@ Item {
anchors.fill: parent
source: timelineRoot
radius: 50
radius: 0
}
}

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -11,7 +12,7 @@ import im.nheko 1.0
Popup {
id: quickSwitcher
property int textHeight: Math.round(Qt.application.font.pixelSize * 2.4)
property int textHeight: Math.round(Qt.application.font.pixelSize * 2)
background: null
width: Math.min(Math.max(Math.round(parent.width / 2),450),parent.width) // limiting width to parent.width/2 can be a bit narrow
@ -24,6 +25,7 @@ Popup {
onOpened: {
roomTextInput.forceActiveFocus();
}
onClosed: TimelineManager.focusMessageInput()
property int textMargin: Nheko.paddingSmall
Column{
@ -35,7 +37,7 @@ Popup {
width: parent.width
font.pixelSize: Math.ceil(quickSwitcher.textHeight * 0.6)
color: Nheko.colors.text
color: Nheko.colors.brightText
onTextEdited: {
completerPopup.completer.searchString = text;
}
@ -67,7 +69,7 @@ Popup {
avatarHeight: quickSwitcher.textHeight
avatarWidth: quickSwitcher.textHeight
centerRowContent: false
rowMargin: Math.round(quickSwitcher.textMargin / 2)
rowMargin: quickSwitcher.textMargin
rowSpacing: quickSwitcher.textMargin
}
}

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -103,7 +104,7 @@ Flow {
border.color: reaction.hovered ? Nheko.colors.text: gentleText
color: reaction.hovered ? Nheko.colors.highlight : (modelData.selfReactedEvent !== '' ? gentleHighlight : Nheko.colors.window)
border.width: 1
radius: reaction.height / 2
radius: 0
}
}

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -13,9 +14,9 @@ Rectangle {
id: replyPopup
Layout.fillWidth: true
visible: room && (room.reply || room.edit)
visible: room && (room.reply || room.edit || room.thread)
// Height of child, plus margins, plus border
implicitHeight: (room && room.reply ? replyPreview.height : closeEditButton.height) + Nheko.paddingSmall
implicitHeight: (room && room.reply ? replyPreview.height : Math.max(closeEditButton.height, closeThreadButton.height)) + Nheko.paddingSmall
color: Nheko.colors.window
z: 3
@ -71,7 +72,7 @@ Rectangle {
id: closeEditButton
visible: room && room.edit
anchors.right: parent.right
anchors.right: closeThreadButton.left
anchors.margins: 8
anchors.top: parent.top
hoverEnabled: true
@ -83,4 +84,21 @@ Rectangle {
onClicked: room.edit = undefined
}
ImageButton {
id: closeThreadButton
visible: room && room.thread
anchors.right: parent.right
anchors.margins: 8
anchors.top: parent.top
hoverEnabled: true
buttonTextColor: room ? TimelineManager.userColor(room.thread, Nheko.colors.base) : Nheko.colors.buttonText
image: ":/icons/icons/ui/dismiss_thread.svg"
width: 22
height: 22
ToolTip.visible: closeThreadButton.hovered
ToolTip.text: qsTr("Cancel Thread")
onClicked: room.thread = undefined
}
}

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -19,6 +20,15 @@ Page {
property int avatarSize: Math.ceil(fontMetrics.lineSpacing * 2.3)
property bool collapsed: false
// HACK: https://bugreports.qt.io/browse/QTBUG-83972, qtwayland cannot auto hide menu
Connections {
function onHideMenu() {
userInfoMenu.close()
roomContextMenu.close()
}
target: MainWindow
}
Component {
id: roomDirectoryComponent
@ -48,7 +58,12 @@ Page {
anchors.right: parent.right
height: parent.height
model: Rooms
reuseItems: true
//reuseItems: true
ScrollBar.vertical: ScrollBar {
id: scrollbar
parent: !collapsed && Settings.scrollbarsInRoomlist ? roomlist : null
}
ScrollHelper {
flickable: parent
@ -108,6 +123,8 @@ Page {
timelineRoot: timelineView
windowTarget: roomWindowW
}
onActiveChanged: { room.lastReadIdOnWindowFocus(); }
}
}
@ -157,6 +174,11 @@ Page {
}
}
Platform.MenuItem {
text: qsTr("Room settings")
onTriggered: TimelineManager.openRoomSettings(roomContextMenu.roomid)
}
Platform.MenuItem {
text: qsTr("Leave room")
onTriggered: TimelineManager.openLeaveRoomDialog(roomContextMenu.roomid)
@ -209,7 +231,7 @@ Page {
roomid: roomContextMenu.roomid
position: -1
title: qsTr("Add or remove from space")
title: qsTr("Add or remove from community...")
childMenu: nestedSpaceMenuLevel
}
}
@ -218,8 +240,8 @@ Page {
id: roomItem
property color backgroundColor: Nheko.colors.window
property color importantText: Nheko.colors.text
property color unimportantText: Nheko.colors.buttonText
property color importantText: Nheko.colors.brightText
property color unimportantText: Nheko.colors.text
property color bubbleBackground: Nheko.colors.highlight
property color bubbleText: Nheko.colors.highlightedText
required property string roomName
@ -241,7 +263,7 @@ Page {
}
height: avatarSize + 2 * Nheko.paddingMedium
width: ListView.view.width
width: ListView.view.width - ((scrollbar.interactive && scrollbar.visible && scrollbar.parent) ? scrollbar.width : 0)
state: "normal"
ToolTip.visible: hovered && collapsed
ToolTip.delay: Nheko.tooltipDelay
@ -249,9 +271,6 @@ Page {
onClicked: {
console.log("tapped " + roomId);
if (isSpace && Communities.currentTagId != "space:"+roomId)
Communities.currentTagId = "space:"+roomId;
if (!Rooms.currentRoom || Rooms.currentRoom.roomId !== roomId)
Rooms.setCurrentRoom(roomId);
else
@ -382,7 +401,7 @@ Page {
Layout.alignment: Qt.AlignBaseline
color: roomItem.importantText
elideWidth: width
fullText: roomName
fullText: TimelineManager.htmlEscape(roomName)
textFormat: Text.RichText
Layout.fillWidth: true
}
@ -413,7 +432,7 @@ Page {
color: roomItem.unimportantText
font.pixelSize: fontMetrics.font.pixelSize * 0.9
elideWidth: width
fullText: lastMessage
fullText: TimelineManager.htmlEscape(lastMessage)
textFormat: Text.RichText
Layout.fillWidth: true
}
@ -453,7 +472,7 @@ Page {
function openUserProfile() {
Nheko.updateUserProfile();
var userProfile = userProfileComponent.createObject(timelineRoot, {
var userProfile = Qt.createComponent("qrc:/qml/dialogs/UserProfile.qml").createObject(timelineRoot, {
"profile": Nheko.currentUser
});
userProfile.show();
@ -562,7 +581,7 @@ Page {
ImageButton {
id: logoutButton
visible: !collapsed
visible: false
Layout.alignment: Qt.AlignVCenter
Layout.preferredWidth: fontMetrics.lineSpacing * 2
Layout.preferredHeight: fontMetrics.lineSpacing * 2
@ -687,7 +706,7 @@ Page {
horizontalPadding: Nheko.paddingMedium
verticalPadding: 0
background: Rectangle {color: Nheko.colors.window}
background: Rectangle {color: Nheko.colors.base}
contentItem: RowLayout {
id: buttonRow
@ -761,7 +780,7 @@ Page {
}
ImageButton {
visible: !collapsed
visible: false
Layout.fillWidth: true
hoverEnabled: true
ripple: false
@ -773,9 +792,9 @@ Page {
ToolTip.text: qsTr("Search rooms (Ctrl+K)")
Layout.margins: Nheko.paddingMedium
onClicked: {
var quickSwitch = quickSwitcherComponent.createObject(timelineRoot);
var quickSwitch = Qt.createComponent("qrc:/qml/QuickSwitcher.qml").createObject(timelineRoot);
quickSwitch.open();
timelineRoot.destroyOnClose(quickSwitch);
destroyOnClosed(quickSwitch);
}
}

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -33,6 +34,10 @@ Pane {
id: publicRooms
}
UserDirectoryModel {
id: userDirectory
}
//Timer {
// onTriggered: gc()
// interval: 1000
@ -47,99 +52,37 @@ Pane {
model: TimelineManager.completerFor("allemoji", "")
}
Component {
id: userProfileComponent
UserProfile {
}
}
function showAliasEditor(settings) {
var dialog = aliasEditor.createObject(timelineRoot, {
var dialog = Qt.createComponent("qrc:/qml/dialogs/AliasEditor.qml").createObject(timelineRoot, {
"roomSettings": settings
});
dialog.show();
destroyOnClose(dialog);
}
Component {
id: aliasEditor
AliasEditor {
}
}
function showPLEditor(settings) {
var dialog = plEditor.createObject(timelineRoot, {
var dialog = Qt.createComponent("qrc:/qml/dialogs/PowerLevelEditor.qml").createObject(timelineRoot, {
"roomSettings": settings
});
dialog.show();
destroyOnClose(dialog);
}
Component {
id: plEditor
PowerLevelEditor {
}
function showSpacePLApplyPrompt(settings, editingModel) {
var dialog = Qt.createComponent("qrc:/qml/dialogs/PowerLevelSpacesApplyDialog.qml").createObject(timelineRoot, {
"roomSettings": settings,
"editingModel": editingModel
});
dialog.show();
destroyOnClose(dialog);
}
Component {
id: roomSettingsComponent
RoomSettings {
}
}
Component {
id: roomMembersComponent
RoomMembers {
}
}
Component {
id: mobileCallInviteDialog
CallInvite {
}
}
Component {
id: quickSwitcherComponent
QuickSwitcher {
}
}
Component {
id: deviceVerificationDialog
DeviceVerification {
}
}
Component {
id: inviteDialog
InviteDialog {
}
}
Component {
id: packSettingsComponent
ImagePackSettingsDialog {
}
function showAllowedRoomsEditor(settings) {
var dialog = Qt.createComponent("qrc:/qml/dialogs/AllowedRoomsSettingsDialog.qml").createObject(timelineRoot, {
"roomSettings": settings
});
dialog.show();
destroyOnClose(dialog);
}
Component {
@ -150,62 +93,6 @@ Pane {
}
Component {
id: rawMessageDialog
RawMessageDialog {
}
}
Component {
id: logoutDialog
LogoutDialog {
}
}
Component {
id: joinRoomDialog
JoinRoomDialog {
}
}
Component {
id: confirmJoinRoomDialog
ConfirmJoinRoomDialog {
}
}
Component {
id: leaveRoomComponent
LeaveRoomDialog {
}
}
Component {
id: imageOverlay
ImageOverlay {
}
}
Component {
id: userSettingsPage
UserSettingsPage {
}
}
Shortcut {
sequence: StandardKey.Quit
onActivated: Qt.quit()
@ -214,7 +101,7 @@ Pane {
Shortcut {
sequence: "Ctrl+K"
onActivated: {
var quickSwitch = quickSwitcherComponent.createObject(timelineRoot);
var quickSwitch = Qt.createComponent("qrc:/qml/QuickSwitcher.qml").createObject(timelineRoot);
quickSwitch.open();
destroyOnClosed(quickSwitch);
}
@ -238,19 +125,19 @@ Pane {
Connections {
function onOpenLogoutDialog() {
var dialog = logoutDialog.createObject(timelineRoot);
var dialog = Qt.createComponent("qrc:/qml/dialogs/LogoutDialog.qml").createObject(timelineRoot);
dialog.open();
destroyOnClose(dialog);
}
function onOpenJoinRoomDialog() {
var dialog = joinRoomDialog.createObject(timelineRoot);
var dialog = Qt.createComponent("qrc:/qml/dialogs/JoinRoomDialog.qml").createObject(timelineRoot);
dialog.show();
destroyOnClose(dialog);
}
function onShowRoomJoinPrompt(summary) {
var dialog = confirmJoinRoomDialog.createObject(timelineRoot, {"summary": summary});
var dialog = Qt.createComponent("qrc:/qml/dialogs/ConfirmJoinRoomDialog.qml").createObject(timelineRoot, {"summary": summary});
dialog.show();
destroyOnClose(dialog);
}
@ -260,7 +147,7 @@ Pane {
Connections {
function onNewDeviceVerificationRequest(flow) {
var dialog = deviceVerificationDialog.createObject(timelineRoot, {
var dialog = Qt.createComponent("qrc:/qml/device-verification/DeviceVerification.qml").createObject(timelineRoot, {
"flow": flow
});
dialog.show();
@ -281,7 +168,7 @@ Pane {
Connections {
function onOpenProfile(profile) {
var userProfile = userProfileComponent.createObject(timelineRoot, {
var userProfile = Qt.createComponent("qrc:/qml/dialogs/UserProfile.qml").createObject(timelineRoot, {
"profile": profile
});
userProfile.show();
@ -289,7 +176,7 @@ Pane {
}
function onShowImagePackSettings(room, packlist) {
var packSet = packSettingsComponent.createObject(timelineRoot, {
var packSet = Qt.createComponent("qrc:/qml/dialogs/ImagePackSettingsDialog.qml").createObject(timelineRoot, {
"room": room,
"packlist": packlist
});
@ -298,7 +185,7 @@ Pane {
}
function onOpenRoomMembersDialog(members, room) {
var membersDialog = roomMembersComponent.createObject(timelineRoot, {
var membersDialog = Qt.createComponent("qrc:/qml/dialogs/RoomMembers.qml").createObject(timelineRoot, {
"members": members,
"room": room
});
@ -307,7 +194,7 @@ Pane {
}
function onOpenRoomSettingsDialog(settings) {
var roomSettings = roomSettingsComponent.createObject(timelineRoot, {
var roomSettings = Qt.createComponent("qrc:/qml/dialogs/RoomSettings.qml").createObject(timelineRoot, {
"roomSettings": settings
});
roomSettings.show();
@ -315,17 +202,21 @@ Pane {
}
function onOpenInviteUsersDialog(invitees) {
var dialog = inviteDialog.createObject(timelineRoot, {
var component = Qt.createComponent("qrc:/qml/dialogs/InviteDialog.qml")
var dialog = component.createObject(timelineRoot, {
"roomId": Rooms.currentRoom.roomId,
"plainRoomName": Rooms.currentRoom.plainRoomName,
"invitees": invitees
});
if (component.status != Component.Ready) {
console.log("Failed to create component: " + component.errorString());
}
dialog.show();
destroyOnClose(dialog);
}
function onOpenLeaveRoomDialog(roomid, reason) {
var dialog = leaveRoomComponent.createObject(timelineRoot, {
var dialog = Qt.createComponent("qrc:/qml/dialogs/LeaveRoomDialog.qml").createObject(timelineRoot, {
"roomId": roomid,
"reason": reason
});
@ -334,7 +225,7 @@ Pane {
}
function onShowImageOverlay(room, eventId, url, originalWidth, proportionalHeight) {
var dialog = imageOverlay.createObject(timelineRoot, {
var dialog = Qt.createComponent("qrc:/qml/dialogs/ImageOverlay.qml").createObject(timelineRoot, {
"room": room,
"eventId": eventId,
"url": url,
@ -352,7 +243,7 @@ Pane {
Connections {
function onNewInviteState() {
if (CallManager.haveCallInvite && Settings.mobileMode) {
var dialog = mobileCallInviteDialog.createObject(timelineRoot);
var dialog = Qt.createComponent("qrc:/qml/voip/CallInvite.qml").createObject(timelineRoot);
dialog.open();
destroyOnClose(dialog);
}
@ -399,7 +290,7 @@ Pane {
id: uiaTokenPrompt
title: UIA.title
prompt: qsTr("Please enter the token, which has been sent to you:")
prompt: qsTr("Please enter the token which has been sent to you:")
onAccepted: (t) => {
return UIA.submit3pidToken(t);
}
@ -454,6 +345,63 @@ Pane {
anchors.fill: parent
initialItem: welcomePage
Transition {
id: reducedMotionTransitionExit
PropertyAnimation {
property: "opacity"
from: 1
to:0
duration: 200
}
}
Transition {
id: reducedMotionTransitionEnter
SequentialAnimation {
PropertyAction { property: "opacity"; value: 0 }
PauseAnimation { duration: 200 }
PropertyAnimation {
property: "opacity"
from: 0
to:1
duration: 200
}
}
}
// for some reason direct bindings to a hidden StackView don't work, so manually store and restore here.
property Transition pushEnterOrg
property Transition pushExitOrg
property Transition popEnterOrg
property Transition popExitOrg
property Transition replaceEnterOrg
property Transition replaceExitOrg
Component.onCompleted: {
pushEnterOrg = pushEnter;
popEnterOrg = popEnter;
replaceEnterOrg = replaceEnter;
pushExitOrg = pushExit;
popExitOrg = popExit;
replaceExitOrg = replaceExit;
updateTrans()
}
function updateTrans() {
pushEnter = Settings.reducedMotion ? reducedMotionTransitionEnter : pushEnterOrg;
pushExit = Settings.reducedMotion ? reducedMotionTransitionExit : pushExitOrg;
popEnter = Settings.reducedMotion ? reducedMotionTransitionEnter : popEnterOrg;
popExit = Settings.reducedMotion ? reducedMotionTransitionExit : popExitOrg;
replaceEnter = Settings.reducedMotion ? reducedMotionTransitionEnter : replaceEnterOrg;
replaceExit = Settings.reducedMotion ? reducedMotionTransitionExit : replaceExitOrg;
}
Connections {
target: Settings
function onReducedMotionChanged() {
mainWindow.updateTrans();
}
}
}
Component {
@ -484,6 +432,15 @@ Pane {
}
}
Component {
id: userSettingsPage
UserSettingsPage {
}
}
Snackbar { id: snackbar }
Connections {

View File

@ -2,6 +2,7 @@
// Copyright (C) 2017 Christian Mollekopf, <mollekopf@kolabsystems.com>
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -61,7 +62,7 @@ Item {
color: Nheko.colors.window
border.color: Nheko.theme.separator
border.width: 1
radius: Nheko.paddingSmall
radius: 0
}
}
@ -213,7 +214,7 @@ Item {
color: Nheko.colors.window
border.color: Nheko.theme.separator
border.width: 1
radius: Nheko.paddingSmall
radius: 0
}
}

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -33,6 +34,7 @@ AbstractButton {
required property bool isEdited
required property bool isStateEvent
required property string replyTo
required property string threadId
required property string userId
required property string userName
required property string roomTopic
@ -40,16 +42,18 @@ AbstractButton {
required property string callType
required property var reactions
required property int trustlevel
required property int notificationlevel
required property int encryptionError
required property int duration
required property var timestamp
required property int status
required property int index
required property int relatedEventCacheBuster
hoverEnabled: true
width: parent.width
height: row.height+(reactionRow.height > 0 ? reactionRow.height-2 : 0 )
height: row.height+(reactionRow.height > 0 ? reactionRow.height-2 : 0 )+unreadRow.height
Rectangle {
color: (Settings.messageHoverHighlight && hovered) ? Nheko.colors.alternateBase : "transparent"
@ -57,15 +61,15 @@ AbstractButton {
// this looks better without margins
TapHandler {
acceptedButtons: Qt.RightButton
onSingleTapped: messageContextMenu.show(eventId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText)
onSingleTapped: messageContextMenu.show(eventId, threadId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText)
gesturePolicy: TapHandler.ReleaseWithinBounds
acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus | PointerDevice.TouchPad
}
}
onPressAndHold: messageContextMenu.show(eventId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText)
onDoubleClicked: chat.model.reply = eventId
onPressAndHold: messageContextMenu.show(eventId, threadId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText)
onDoubleClicked: room.reply = eventId
DragHandler {
id: draghandler
@ -74,7 +78,7 @@ AbstractButton {
xAxis.minimum: -100
onActiveChanged: {
if(!active && (x < -70 || x > 70))
chat.model.reply = eventId
room.reply = eventId
}
}
states: State {
@ -114,7 +118,9 @@ AbstractButton {
property color userColor: TimelineManager.userColor(userId, Nheko.colors.base)
property color bgColor: Nheko.colors.base
color: (Settings.bubbles && !isStateEvent) ? Qt.tint(bgColor, Qt.hsla(userColor.hslHue, 0.5, userColor.hslLightness, 0.2)) : "#00000000"
radius: 4
radius: 0
border.width: r.notificationlevel == MtxEvent.Highlight ? 1 : 0
border.color: Nheko.theme.red
GridLayout {
anchors {
@ -123,6 +129,7 @@ AbstractButton {
right: parent.right
margins: (Settings.bubbles && ! isStateEvent)? 4 : 2
leftMargin: 4
rightMargin: 4
}
id: msg
rowSpacing: 0
@ -229,13 +236,13 @@ AbstractButton {
}
Image {
visible: isEdited || eventId == chat.model.edit
visible: isEdited || eventId == room.edit
Layout.alignment: Qt.AlignRight | Qt.AlignTop
height: parent.iconSize
width: parent.iconSize
sourceSize.width: parent.iconSize * Screen.devicePixelRatio
sourceSize.height: parent.iconSize * Screen.devicePixelRatio
source: "image://colorimage/:/icons/icons/ui/edit.svg?" + ((eventId == chat.model.edit) ? Nheko.colors.highlight : Nheko.colors.buttonText)
source: "image://colorimage/:/icons/icons/ui/edit.svg?" + ((eventId == room.edit) ? Nheko.colors.highlight : Nheko.colors.buttonText)
ToolTip.visible: editHovered.hovered
ToolTip.delay: Nheko.tooltipDelay
ToolTip.text: qsTr("Edited")
@ -247,6 +254,20 @@ AbstractButton {
}
ImageButton {
visible: threadId
Layout.alignment: Qt.AlignRight | Qt.AlignTop
height: parent.iconSize
width: parent.iconSize
image: ":/icons/icons/ui/thread.svg"
buttonTextColor: TimelineManager.userColor(threadId, Nheko.colors.base)
ToolTip.visible: hovered
ToolTip.delay: Nheko.tooltipDelay
ToolTip.text: qsTr("Part of a thread")
anchors.verticalCenter: ts.verticalCenter
onClicked: room.thread = threadId
}
EncryptionIndicator {
visible: room.isEncrypted
encrypted: isEncrypted
@ -277,10 +298,11 @@ AbstractButton {
}
}
}
Reactions {
anchors {
top: row.bottom
topMargin: -2
topMargin: -4
left: row.bubbleOnRight? undefined : row.left
right: row.bubbleOnRight? row.right : undefined
}
@ -292,4 +314,19 @@ AbstractButton {
reactions: r.reactions
eventId: r.eventId
}
Rectangle {
id: unreadRow
anchors {
top: reactionRow.bottom
topMargin: 5
left: parent.left
right: parent.right
}
color: Nheko.colors.highlight
visible: (r.index > 0 && (room.fullyReadEventId == r.eventId))
height: visible ? 3 : 0
}
}

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -13,6 +14,7 @@ import Qt.labs.platform 1.1 as Platform
import QtQuick 2.15
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.3
import QtQuick.Particles 2.15
import QtQuick.Window 2.13
import im.nheko 1.0
import im.nheko.EmojiModel 1.0
@ -23,8 +25,14 @@ Item {
property var room: null
property var roomPreview: null
property bool showBackButton: false
property bool shouldEffectsRun: false
clip: true
onRoomChanged: if (room != null) room.triggerSpecialEffects()
// focus message input on key press, but not on Ctrl-C and such.
Keys.onPressed: if (event.text && !topBar.searchHasFocus) TimelineManager.focusMessageInput();
Shortcut {
sequence: StandardKey.Close
onActivated: Rooms.resetCurrentRoom()
@ -66,6 +74,8 @@ Item {
spacing: 0
TopBar {
id: topBar
showBackButton: timelineView.showBackButton
}
@ -81,7 +91,7 @@ Item {
Layout.fillWidth: true
Layout.fillHeight: true
color: Nheko.colors.base
color: Nheko.colors.window
ColumnLayout {
anchors.fill: parent
@ -102,6 +112,7 @@ Item {
MessageView {
implicitHeight: msgView.height - typingIndicator.height
searchString: topBar.searchString
Layout.fillWidth: true
}
@ -161,6 +172,7 @@ Item {
property string roomName: room ? room.roomName : (roomPreview ? roomPreview.roomName : "")
property string roomTopic: room ? room.roomTopic : (roomPreview ? roomPreview.roomTopic : "")
property string avatarUrl: room ? room.roomAvatarUrl : (roomPreview ? roomPreview.roomAvatarUrl : "")
property string reason: roomPreview ? roomPreview.reason : ""
visible: room != null && room.isSpace || roomPreview != null
enabled: visible
@ -268,6 +280,44 @@ Item {
onClicked: Rooms.declineInvite(roomPreview.roomid)
}
ScrollView {
id: reasonField
property bool showReason: false
Layout.alignment: Qt.AlignHCenter
Layout.fillWidth: true
Layout.leftMargin: Nheko.paddingLarge
Layout.rightMargin: Nheko.paddingLarge
visible: preview.reason !== "" && showReason
TextArea {
text: TimelineManager.escapeEmoji(preview.reason)
wrapMode: TextEdit.WordWrap
textFormat: TextEdit.RichText
readOnly: true
background: null
selectByMouse: true
color: Nheko.colors.text
horizontalAlignment: TextEdit.AlignHCenter
}
}
Button {
id: showReasonButton
Layout.alignment: Qt.AlignHCenter
//Layout.fillWidth: true
Layout.leftMargin: Nheko.paddingLarge
Layout.rightMargin: Nheko.paddingLarge
visible: preview.reason !== ""
text: reasonField.showReason ? qsTr("Hide invite reason") : qsTr("Show invite reason")
onClicked: {
reasonField.showReason = !reasonField.showReason;
}
}
Item {
visible: room != null
Layout.preferredHeight: Math.ceil(fontMetrics.lineSpacing * 2)
@ -295,11 +345,75 @@ Item {
onClicked: Rooms.resetCurrentRoom()
}
ParticleSystem { id: confettiParticleSystem
Component.onCompleted: pause();
paused: !shouldEffectsRun
}
Emitter {
id: confettiEmitter
width: parent.width * 3/4
enabled: false
anchors.horizontalCenter: parent.horizontalCenter
y: parent.height
emitRate: Math.min(400 * Math.sqrt(parent.width * parent.height) / 870, 1000)
lifeSpan: 15000
system: confettiParticleSystem
maximumEmitted: 500
velocityFromMovement: 8
size: 16
sizeVariation: 4
velocity: PointDirection {
x: 0
y: -Math.min(450 * parent.height / 700, 1000)
xVariation: Math.min(4 * parent.width / 7, 450)
yVariation: 250
}
}
ImageParticle {
system: confettiParticleSystem
source: "qrc:/confettiparticle.svg"
rotationVelocity: 0
rotationVelocityVariation: 360
colorVariation: 1
color: "white"
entryEffect: ImageParticle.None
xVector: PointDirection {
x: 1
y: 0
xVariation: 0.2
yVariation: 0.2
}
yVector: PointDirection {
x: 0
y: 0.5
xVariation: 0.2
yVariation: 0.2
}
}
Gravity {
system: confettiParticleSystem
anchors.fill: parent
magnitude: 350
angle: 90
}
NhekoDropArea {
anchors.fill: parent
roomid: room ? room.roomId : ""
}
Timer {
id: effectsTimer
onTriggered: shouldEffectsRun = false;
interval: confettiEmitter.lifeSpan
repeat: false
running: false
}
Connections {
function onOpenReadReceiptsDialog(rr) {
var dialog = readReceiptsDialog.createObject(timelineRoot, {
@ -311,13 +425,31 @@ Item {
}
function onShowRawMessageDialog(rawMessage) {
var dialog = rawMessageDialog.createObject(timelineRoot, {
var dialog = Qt.createComponent("qrc:/qml/dialogs/RawMessageDialog.qml").createObject(timelineRoot, {
"rawMessage": rawMessage
});
dialog.show();
timelineRoot.destroyOnClose(dialog);
}
function onConfetti()
{
if (!Settings.fancyEffects)
return
shouldEffectsRun = true;
confettiEmitter.pulse(parent.height * 2)
room.markSpecialEffectsDone()
}
function onConfettiDone()
{
if (!Settings.fancyEffects)
return
effectsTimer.start();
}
target: room
}

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -22,7 +23,7 @@ Switch {
Rectangle {
height: 3 * parent.height / 4
radius: height / 2
radius: 0
width: parent.width - height
x: radius
y: parent.height / 2 - height / 2
@ -35,7 +36,7 @@ Switch {
y: parent.height / 2 - height / 2
width: parent.height
height: width
radius: width / 2
radius: 0
color: toggleButton.enabled ? "whitesmoke" : "#cccccc"
border.color: "#ebebeb"
}

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -25,13 +26,36 @@ Pane {
property bool isDirect: room ? room.isDirect : false
property string directChatOtherUserId: room ? room.directChatOtherUserId : ""
property bool searchHasFocus: searchField.focus && searchField.enabled
property string searchString: ""
// HACK: https://bugreports.qt.io/browse/QTBUG-83972, qtwayland cannot auto hide menu
Connections {
function onHideMenu() {
roomOptionsMenu.close()
}
target: MainWindow
}
onRoomIdChanged: {
searchString = "";
searchButton.searchActive = false;
searchField.text = ""
}
Shortcut {
sequence: StandardKey.Find
onActivated: searchButton.searchActive = !searchButton.searchActive
}
Layout.fillWidth: true
implicitHeight: topLayout.height + Nheko.paddingMedium * 2
z: 3
padding: 0
background: Rectangle {
color: Nheko.colors.window
color: Nheko.colors.base
}
TapHandler {
@ -49,6 +73,13 @@ Pane {
return;
}
if (communityLabel.visible && eventPoint.position.y < communityAvatar.height + Nheko.paddingMedium + Nheko.paddingSmall/2) {
if (!Communities.trySwitchToSpace(room.parentSpace.roomid))
room.parentSpace.promptJoin();
eventPoint.accepted = true
return;
}
if (room) {
let p = topBar.mapToItem(roomTopicC, eventPoint.position.x, eventPoint.position.y);
let link = roomTopicC.linkAt(p.x, p.y);
@ -80,17 +111,52 @@ Pane {
columnSpacing: Nheko.paddingSmall
rowSpacing: Nheko.paddingSmall
Avatar {
id: communityAvatar
visible: roomid && room.parentSpace.isLoaded && ("space:"+room.parentSpace.roomid != Communities.currentTagId)
property string avatarUrl: (Settings.groupView && room && room.parentSpace && room.parentSpace.roomAvatarUrl) || ""
property string communityId: (Settings.groupView && room && room.parentSpace && room.parentSpace.roomid) || ""
property string communityName: (Settings.groupView && room && room.parentSpace && room.parentSpace.roomName) || ""
Layout.column: 1
Layout.row: 0
Layout.alignment: Qt.AlignRight
width: fontMetrics.lineSpacing
height: fontMetrics.lineSpacing
url: avatarUrl.replace("mxc://", "image://MxcImage/")
roomid: communityId
displayName: communityName
enabled: false
}
Label {
id: communityLabel
visible: communityAvatar.visible
Layout.column: 2
Layout.row: 0
Layout.fillWidth: true
color: Nheko.colors.text
text: qsTr("In %1").arg(communityAvatar.displayName)
maximumLineCount: 1
elide: Text.ElideRight
textFormat: Text.RichText
}
ImageButton {
id: backToRoomsButton
Layout.column: 0
Layout.row: 0
Layout.row: 1
Layout.rowSpan: 2
Layout.alignment: Qt.AlignVCenter
Layout.preferredHeight: Nheko.avatarSize - Nheko.paddingMedium
Layout.preferredWidth: Nheko.avatarSize - Nheko.paddingMedium
visible: showBackButton
image: ":/icons/icons/ui/angle-arrow-left.svg"
image: ":/icons/icons/ui/angle-arrow-left.svg?" + Nheko.colors.light
ToolTip.visible: hovered
ToolTip.text: qsTr("Back to room list")
onClicked: Rooms.resetCurrentRoom()
@ -98,7 +164,7 @@ Pane {
Avatar {
Layout.column: 1
Layout.row: 0
Layout.row: 1
Layout.rowSpan: 2
Layout.alignment: Qt.AlignVCenter
width: Nheko.avatarSize
@ -113,9 +179,10 @@ Pane {
Label {
Layout.fillWidth: true
Layout.column: 2
Layout.row: 0
color: Nheko.colors.text
Layout.row: 1
color: Nheko.colors.brightText
font.pointSize: fontMetrics.font.pointSize * 1.1
font.bold: true
text: roomName
maximumLineCount: 1
elide: Text.ElideRight
@ -124,26 +191,56 @@ Pane {
MatrixText {
id: roomTopicC
color: Nheko.colors.brightText
Layout.fillWidth: true
Layout.column: 2
Layout.row: 1
Layout.row: 2
Layout.maximumHeight: fontMetrics.lineSpacing * 2 // show 2 lines
selectByMouse: false
enabled: false
clip: true
text: roomTopic
text: "<style type=\"text/css\">a { font-weight: bold; color:" + Nheko.colors.brightText + ";}</style>" + roomTopic
}
ImageButton {
id: pinButton
property bool pinsShown: !Settings.hiddenPins.includes(roomId)
visible: !!room && room.pinnedMessages.length > 0
Layout.column: 3
Layout.row: 1
Layout.rowSpan: 2
Layout.alignment: Qt.AlignVCenter
Layout.preferredHeight: Nheko.avatarSize - Nheko.paddingMedium
Layout.preferredWidth: Nheko.avatarSize - Nheko.paddingMedium
image: pinsShown ? ":/icons/icons/ui/pin.svg" : ":/icons/icons/ui/pin-off.svg"
ToolTip.visible: hovered
ToolTip.text: qsTr("Show or hide pinned messages")
onClicked: {
var ps = Settings.hiddenPins;
if (pinsShown) {
ps.push(roomId);
} else {
const index = ps.indexOf(roomId);
if (index > -1) {
ps.splice(index, 1);
}
}
Settings.hiddenPins = ps;
}
}
AbstractButton {
Layout.column: 3
Layout.row: 0
Layout.column: 4
Layout.row: 1
Layout.rowSpan: 2
Layout.preferredHeight: Nheko.avatarSize - Nheko.paddingMedium
Layout.preferredWidth: Nheko.avatarSize - Nheko.paddingMedium
visible: isEncrypted
contentItem: EncryptionIndicator {
sourceSize.height: parent.Layout.preferredHeight * Screen.devicePixelRatio
sourceSize.width: parent.Layout.preferredWidth * Screen.devicePixelRatio
encrypted: isEncrypted
trust: trustlevel
enabled: false
@ -173,46 +270,44 @@ Pane {
}
ImageButton {
id: pinButton
id: searchButton
property bool pinsShown: !Settings.hiddenPins.includes(roomId)
property bool searchActive: false
visible: !!room && room.pinnedMessages.length > 0
Layout.column: 4
Layout.row: 0
visible: !!room
Layout.column: 5
Layout.row: 1
Layout.rowSpan: 2
Layout.alignment: Qt.AlignVCenter
Layout.preferredHeight: Nheko.avatarSize - Nheko.paddingMedium
Layout.preferredWidth: Nheko.avatarSize - Nheko.paddingMedium
image: pinsShown ? ":/icons/icons/ui/pin.svg" : ":/icons/icons/ui/pin-off.svg"
image: ":/icons/icons/ui/search.svg"
ToolTip.visible: hovered
ToolTip.text: qsTr("Show or hide pinned messages")
onClicked: {
var ps = Settings.hiddenPins;
if (pinsShown) {
ps.push(roomId);
} else {
const index = ps.indexOf(roomId);
if (index > -1) {
ps.splice(index, 1);
}
}
Settings.hiddenPins = ps;
}
ToolTip.text: qsTr("Search this room")
onClicked: searchActive = !searchActive
onSearchActiveChanged: {
if (searchActive) {
searchField.forceActiveFocus();
}
else {
searchField.clear();
topBar.searchString = "";
}
}
}
ImageButton {
id: roomOptionsButton
visible: !!room
Layout.column: 5
Layout.row: 0
Layout.column: 6
Layout.row: 1
Layout.rowSpan: 2
Layout.alignment: Qt.AlignVCenter
Layout.preferredHeight: Nheko.avatarSize - Nheko.paddingMedium
Layout.preferredWidth: Nheko.avatarSize - Nheko.paddingMedium
image: ":/icons/icons/ui/options.svg"
image: ":/icons/icons/ui/options.svg?" + Nheko.colors.light
ToolTip.visible: hovered
ToolTip.text: qsTr("Room options")
onClicked: roomOptionsMenu.open(roomOptionsButton)
@ -248,9 +343,9 @@ Pane {
ScrollView {
id: pinnedMessages
Layout.row: 2
Layout.row: 3
Layout.column: 2
Layout.columnSpan: 3
Layout.columnSpan: 4
Layout.fillWidth: true
Layout.preferredHeight: Math.min(contentHeight, Nheko.avatarSize * 4)
@ -329,9 +424,9 @@ Pane {
ScrollView {
id: widgets
Layout.row: 3
Layout.row: 4
Layout.column: 2
Layout.columnSpan: 1
Layout.columnSpan: 4
Layout.fillWidth: true
Layout.preferredHeight: Math.min(contentHeight, Nheko.avatarSize * 1.5)
@ -361,6 +456,22 @@ Pane {
}
}
}
MatrixTextField {
id: searchField
visible: searchButton.searchActive
enabled: visible
hasClear: true
Layout.row: 5
Layout.column: 2
Layout.columnSpan: 4
Layout.fillWidth: true
placeholderText: qsTr("Enter search query")
onAccepted: topBar.searchString = text
}
}
CursorShape {

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -16,7 +17,7 @@ Item {
id: typingRect
visible: (room && room.typingUsers.length > 0)
color: Nheko.colors.base
color: Nheko.colors.dark
anchors.fill: parent
z: 3
@ -28,7 +29,7 @@ Item {
anchors.right: parent.right
anchors.rightMargin: 10
anchors.bottom: parent.bottom
color: Nheko.colors.text
color: Nheko.colors.brightText
text: room ? room.formatTypingUsers(room.typingUsers, Nheko.colors.base) : ""
textFormat: Text.RichText
}

View File

@ -1,4 +1,5 @@
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -41,15 +42,15 @@ Page {
background: Rectangle {
color: Nheko.colors.window
radius: Nheko.paddingMedium
radius: 0
}
contentItem: ColumnLayout {
Image {
Layout.fillHeight: true
Layout.fillWidth: true
sourceSize.height: height
sourceSize.width: width
sourceSize.height: parent.availableHeight - namefield.height
sourceSize.width: parent.availableWidth
fillMode: Image.PreserveAspectFit
smooth: true
mipmap: true
@ -63,6 +64,7 @@ Page {
source: (modelData.thumbnail != "") ? modelData.thumbnail : ("image://colorimage/:/icons/icons/ui/"+typeStr+".svg?" + Nheko.colors.buttonText)
}
MatrixTextField {
id: namefield
Layout.fillWidth: true
text: modelData.filename
onTextEdited: modelData.filename = text

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -129,7 +130,7 @@ Container {
orientation: ListView.Horizontal
highlightRangeMode: ListView.StrictlyEnforceRange
interactive: singlePageMode
highlightMoveDuration: container.singlePageMode ? 200 : 0
highlightMoveDuration: (container.singlePageMode && !Settings.reducedMotion) ? 200 : 0
currentIndex: container.singlePageMode ? container.pageIndex : 0
boundsBehavior: Flickable.StopAtBounds
}

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -19,17 +20,6 @@ Button {
property string iconImage: ""
DropShadow {
anchors.fill: control.background
horizontalOffset: 3
verticalOffset: 3
radius: 8
samples: 17
cached: true
color: "#80000000"
source: control.background
}
contentItem: RowLayout {
spacing: 0
anchors.centerIn: parent
@ -59,7 +49,7 @@ Button {
background: Rectangle {
//height: control.contentItem.implicitHeight * 2
//width: control.contentItem.implicitWidth * 2
radius: height / 8
radius: 0
color: Qt.lighter(Nheko.colors.dark, control.down ? 1.4 : (control.hovered ? 1.2 : 1))
}

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -36,7 +37,7 @@ Dialog {
color: Nheko.colors.window
border.color: Nheko.theme.separator
border.width: 1
radius: Nheko.paddingSmall
radius: 0
}
}

View File

@ -1,4 +1,5 @@
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -19,7 +20,7 @@ Rectangle {
visible: mayBeVisible && notificationCount > 0
implicitHeight: notificationBubbleText.height + Nheko.paddingMedium
implicitWidth: Math.max(notificationBubbleText.width, height)
radius: height / 2
radius: 0
color: hasLoudNotification ? Nheko.theme.red : bubbleBackgroundColor
ToolTip.text: notificationCount
ToolTip.delay: Nheko.tooltipDelay

View File

@ -1,4 +1,5 @@
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -52,7 +53,7 @@ Item {
color: dragArea.held ? Nheko.colors.highlight : Nheko.colors.base
Behavior on color { ColorAnimation { duration: 100 } }
radius: 2
radius: 0
Drag.active: dragArea.held
Drag.source: dragArea

View File

@ -1,4 +1,5 @@
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -13,7 +14,7 @@ Platform.Menu {
property Component childMenu
property int position: modelData == undefined ? -2 : modelData.treeIndex
title: modelData != undefined ? modelData.name : qsTr("Add or remove from space")
title: modelData != undefined ? modelData.name : qsTr("Add or remove from community")
property bool loadChildren: false
onAboutToShow: loadChildren = true

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later

View File

@ -0,0 +1,53 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
import ".."
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import im.nheko 1.0
ItemDelegate {
property alias bgColor: background.color
property alias userid: avatar.userid
property alias displayName: avatar.displayName
property string avatarUrl
implicitHeight: layout.implicitHeight + Nheko.paddingSmall * 2
background: Rectangle {id: background}
GridLayout {
id: layout
anchors.centerIn: parent
width: parent.width - Nheko.paddingSmall * 2
rows: 2
columns: 2
rowSpacing: Nheko.paddingSmall
columnSpacing: Nheko.paddingMedium
Avatar {
id: avatar
Layout.rowSpan: 2
Layout.preferredWidth: Nheko.avatarSize
Layout.preferredHeight: Nheko.avatarSize
Layout.alignment: Qt.AlignLeft
url: avatarUrl.replace("mxc://", "image://MxcImage/")
enabled: false
}
Label {
Layout.fillWidth: true
text: displayName
color: TimelineManager.userColor(userid, Nheko.colors.window)
font.pointSize: fontMetrics.font.pointSize
}
Label {
Layout.fillWidth: true
Layout.alignment: Qt.AlignTop
text: userid
color: Nheko.colors.buttonText
font.pointSize: fontMetrics.font.pointSize * 0.9
}
}
}

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -15,7 +16,7 @@ Rectangle {
required property int encryptionError
required property string eventId
radius: fontMetrics.lineSpacing / 2 + Nheko.paddingMedium
radius: 0
width: parent.width? parent.width : 0
implicitWidth: encryptedText.implicitWidth+24+Nheko.paddingMedium*3 // Column doesn't provide a useful implicitWidth, should be replaced by ColumnLayout
height: contents.implicitHeight + Nheko.paddingMedium * 2

View File

@ -0,0 +1,60 @@
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
import ".."
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import im.nheko 1.0
Rectangle {
id: r
required property string username
radius: 0
width: parent.width ? Math.min(parent.width, 700) : 0
anchors.horizontalCenter: parent.horizontalCenter
height: contents.implicitHeight + Nheko.paddingMedium * 2
color: Nheko.colors.alternateBase
border.color: Nheko.theme.green
border.width: 2
RowLayout {
id: contents
anchors.fill: parent
anchors.margins: Nheko.paddingMedium
spacing: Nheko.paddingMedium
Image {
source: "image://colorimage/:/icons/icons/ui/shield-filled-checkmark.svg?" + Nheko.theme.green
Layout.alignment: Qt.AlignVCenter
width: 24
height: width
}
Column {
spacing: Nheko.paddingSmall
Layout.fillWidth: true
MatrixText {
text: qsTr("%1 enabled end-to-end encryption").arg(r.username)
font.bold: true
font.pointSize: 14
color: Nheko.colors.text
width: parent.width
}
MatrixText {
text: qsTr("Encryption keeps your messages safe by only allowing the people you sent the message to to read it. For extra security, if you want to make sure you are talking to the right people, you can verify them in real life.")
color: Nheko.colors.text
width: parent.width
}
}
}
}

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
@ -28,10 +29,10 @@ Item {
Rectangle {
id: button
color: Nheko.colors.light
radius: 22
height: 44
width: 44
color: Nheko.colors.base
radius: 0
height: 36
width: 36
Image {
id: img
@ -42,7 +43,7 @@ Item {
sourceSize.width: 40
anchors.centerIn: parent
source: "qrc:/icons/icons/ui/download.svg"
source: "qrc:/icons/icons/ui/download.svg?"+Nheko.colors.brightText
fillMode: Image.Pad
}
@ -68,7 +69,7 @@ Item {
text: filename
textFormat: Text.PlainText
elide: Text.ElideRight
color: Nheko.colors.text
color: Nheko.colors.brightText
}
Text {
@ -78,7 +79,7 @@ Item {
text: filesize
textFormat: Text.PlainText
elide: Text.ElideRight
color: Nheko.colors.text
color: Nheko.colors.brightText
}
}
@ -86,9 +87,9 @@ Item {
}
Rectangle {
color: Nheko.colors.alternateBase
color: Nheko.colors.base
z: -1
radius: 10
radius: 0
anchors.fill: parent
visible: !Settings.bubbles // the bubble in a bubble looks odd
}

View File

@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
// SPDX-FileCopyrightText: 2023 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later

Some files were not shown because too many files have changed in this diff Show More