Compare commits

...

152 Commits

Author SHA1 Message Date
a6d16ba1f8 misc: pass HideSelf to true by default
Change-Id: I507ec00f9d94ae9cec5f63ca948bca1f9cdd82b3
2023-09-20 13:13:23 -04:00
b0c205159e misc: bump daemon
Change-Id: I424250b351a0947fe37c4baebfc27405ff48dad8
2023-09-20 09:20:59 -04:00
0c440660c4 i18n: automatic bump
Change-Id: I65efe898569dff45b9e6341db6e6b9332e60d890
2023-09-19 11:40:04 -04:00
c8cc61520d misc: update version name to Eleutheria
Change-Id: I6679ffec816636d6bb8bfded88b86f23c11f3b03
2023-09-19 11:01:13 -04:00
ab25276e27 Dialog popup: BaseModalDialog redone, every popup based on it checked
GitLab: #1326
Change-Id: Ia72a9f4d2daa60261054e050ab89de18a139ecd2
2023-09-19 10:33:20 -04:00
7b41c6faff UserProfile: display name must be readOnly
Change-Id: I3cd106af5ad7a141d884b948448e25053ab0832b
GitLab: #1349
2023-09-18 14:35:54 -04:00
7a84518f2c misc: cleanup, remove cacheAvatars
Now there is only one client, this doesn't need to be configured

Change-Id: Iba1265fbdb8ab18bfb44fc7c2c70ebfe6000ee2c
GitLab: #1305
2023-09-18 10:25:12 -04:00
1a12cb3b8c misc: replace Swarm Created message in 1:1
Change-Id: I71388da217d4912a4f89c36e8a539cdc65f40097
GitLab: #1342
2023-09-18 10:23:13 -04:00
75a154f4fe plugins: fix background of installed plugin
Change-Id: I0b890270dc10ddb3d77d10f07252d5da7266ba7f
2023-09-18 10:10:25 -04:00
b95abbc891 misc: fix shortcut for tile screenshot
Change-Id: Ic2e18dc9aef3e01d7d8f1f935b90fe73b527127b
GitLab: #1344
2023-09-15 12:34:57 -04:00
bc51b74692 misc: add search tooltip
Change-Id: I55e29557eca3b32c714a313cd18aff66a870fd0f
GitLab: #1343
2023-09-15 12:33:03 -04:00
899ff6120c misc: move GenericErrorsRow in MainApplicationWindow
Change-Id: I09fea85e9fa603481bd2cfe81b15a4d94dcc3ebd
Gitlab: #1135
2023-09-15 12:29:27 -04:00
b77012baae misc: bump daemon
Change-Id: Ibf34d81f97f5d601e7357096279e07833a940a33
2023-09-14 13:35:43 -04:00
bc34abc8f4 misc: add tooltip for show preview button
Change-Id: I8b292bdb157c0fed6f873263dc97c4f7f2fa1f02
GitLab: #1337
2023-09-14 13:35:02 -04:00
69b59ad2dd misc: bump daemon
Change-Id: Ie3c7b8665c87e0b7e1b051816f72ec223e559c92
2023-09-14 10:44:33 -04:00
1f2401bc7e PluginDescription: handle language to send request to the plugin store
Change-Id: Id96578cf238246ebe69a6f9b77b0ed1d1f465f38
2023-09-14 10:44:19 -04:00
06b0f1d39c plugins: use pluginId for getIconUrl
Change-Id: I560429fa6604a595c945ffca73fed3c43b152e40
2023-09-14 10:18:01 -04:00
d5b36e7a6d Icon local Path: change identifier plugin name to plugin id
Change-Id: I5091b6f4d5a8d42c73b574d4f889d5795b7ec0db
2023-09-13 15:22:25 -04:00
4e2ae6cde0 misc: bump daemon
Change-Id: I5b014d9c1bf5541fef6dc0af0eda57357c149e9c
2023-09-13 15:28:34 -03:00
0895a9f183 TextEditor: patch height binding after tap big message
Change-Id: I91111ff3b4d54dda85e649e62eef91ad9b935bb8
2023-09-13 11:06:22 -04:00
e8075a412e misc: bump daemon
Change-Id: Ie3c9570dd55e442a6b1e996801e0bb1a7f92b77c
2023-09-12 11:34:20 -04:00
4d55a1430d misc: remove ubuntu 22.10 (EOL)
Change-Id: I9a7bbd77a91b885666519e726530df2ebd7097ca
2023-09-12 11:26:27 -04:00
8de099e38d MessageOptionsPopup: add option to locally delete file
This button offers an option to remove sent/downloaded files
from the device.

Change-Id: Ida1b135681243fd6055034d8a2d699d11bf040e5
GitLab: #1287
2023-09-12 10:59:23 -04:00
306c428019 misc: fix log warning
Change-Id: I943bf58612dc7e6f95fab064c3cd18afda60d9f2
2023-09-12 10:36:46 -04:00
c0a5ced044 misc: fix message bar buttons background color
Change-Id: Ie934835952180803473645bd041bbbba06f02d4f
2023-09-12 10:36:46 -04:00
9f570a3cee Plugin Queries: resolve architecture to be able to handle dynamically all platform
Change-Id: I35ea5be7dc87dcf2e15b5803f9819887c946b91a
2023-09-12 07:32:34 -04:00
2371f0c09f conv-avatar: show a placeholder avatar when base64 data won't load
This does not fix the issue, it's a workaround in case the image data can't load. This may be related to loading large PNGs directly from base 64 strings.

Gitlab: #1329
Change-Id: I45729d10a33b8c8ad0adffb339dbcae40c4b18f9
2023-09-11 15:06:14 -04:00
f605cfce81 white-labeling: fix local file paths
Fixes white-labeling not working on Windows

- use portable local file URI prefixes
- emit download failed when the file can't be created locally
- light refactor

Change-Id: Id6c4c07a9b0edcc18d0d5f5c8852308aaf1e8b44
2023-09-11 10:17:38 -04:00
2aa3212b8f misc: bump daemon
Change-Id: I78e305b020902010dfc9a1c3b1c82d09f0ed2870
2023-09-08 10:59:40 -04:00
031d4348bc build.py: Provide the TARBALLS hint for all distributions.
There's nothing particular about Guix in the handling of TARBALLS, so
display the hint for all distributions.

Change-Id: Icc5f224f08dd0d57f53ee7bed46b11048bff303b
2023-09-07 07:52:00 -04:00
e7436dbc05 accessibility: make the shortcuts focusable
Gitlab: #1211
Change-Id: Idf6a9971ceb06d1f9d42a907f948f402623fccd2
2023-09-06 15:16:37 -04:00
b291728472 tips: center tips when only one or two are left
GitLab: #1184

Change-Id: I9791565e371ca1a5693e85417c9b253802e0b2b3
2023-09-05 09:33:48 -04:00
5820052a53 i18n: automatic bump
Change-Id: I5b0ece4c53706cb698ac904b57fece4c120c1cb2
2023-09-04 16:42:37 -04:00
65cc7a36ed messageBar: hide the popup when you click on show less
GitLab: #1322
Change-Id: I87d4b94a53a4720da5fdf2940ad23f6e17c8fd48
2023-09-01 10:16:43 -04:00
46e2354274 messageBar: display "showLess" when needed
GitLab: #1309
GitLab: #1125
Change-Id: I2b443750731170bebe3532338517e5e0e0ed594b
2023-09-01 10:16:41 -04:00
1bbd8e31af cmake: fix check for minimum major/minor version
The current check only fails if the major and minor version are less than the minimum.
This simplifies the check even removing the major version check which is a find requirement already.

Gitlab: #1330
Change-Id: Id066953c50ef4a925713dbd9203ebe7a3a36f4a1
2023-08-30 14:04:15 -04:00
0bd24bf8c5 misc: bump daemon
Change-Id: I9ccaed3f275b0573e98628c66ebc605fe5764c14
2023-08-25 18:19:29 -03:00
a028696e57 Plugin: change remote plugin margin
Change-Id: Id2289e5f22f23f0a1295dc63d00b6e36133e27b7
2023-08-25 16:40:55 -04:00
c8b371e77a Conversation : remove zero member conversation
(Note: this is a work around, need investigation)

Change-Id: I43d3c26352a068d29486da38b3e25487f10cd9fa
2023-08-25 15:27:17 -04:00
b26259dac8 misc: fix error log in emojipicker
Change-Id: I2dc5ac7743de921469f0b14e12de46b8827184a7
2023-08-24 09:38:18 -03:00
423290a09a emojiPicker: automatic keyboard focus
GitLab: #1220
Change-Id: I848b5352b8214c2112dddc8e69b7bc96d0e372e7
2023-08-24 08:02:41 -04:00
3195fa9b22 sendFile: sending with Enter and automatic focus on the text area
GitLab: #1275
Change-Id: I70036b158cfede3a6c6a7de9bb63a049c8fec39a
2023-08-24 08:02:01 -04:00
4619f04f7b emojireaction: fix maxMsgWidth is not defined error
Change-Id: Id6229ff59c5b896ffe72068e91fc70e334c11aad
2023-08-23 15:46:25 -04:00
ae2380c71b misc: removed unecessary log
Change-Id: I768f32e3bbc2780becc83fe92d6f6f8c9215cec2
2023-08-23 15:55:34 -03:00
2bdf8e088c fix: missing pluginId value
Change-Id: Id1b30c2b35affc3beb3dc2a5646e45c855196a82
2023-08-23 15:17:35 -03:00
9947021394 PluginId: add handler for the plugin id
Change-Id: I377d5856491d38f127fe422e84a6c93839295447
2023-08-23 11:50:14 -04:00
80fe376e3c i18n: automatic bump
Change-Id: Ie2b458e17eb1ecbf7a517c2588e7b87ef36b5752
2023-08-23 09:09:48 -04:00
d1eb1f5885 macOS: fix crash on force quit
This patch ensures that views are destroyed when the user quits
the application.

Change-Id: I173643136d277fe604838bdf19a6c292b066ee8d
2023-08-22 09:07:35 -04:00
b1ca6cf861 PluginView: refactor the ui to a better view
Gitlab: #1306

Change-Id: Ic3d952408c352715f2cd611dad63cf92cfb81ff0
2023-08-21 10:54:35 -04:00
8c728374a7 emojiReactions: change the emojis layout
Gitlab: #1230
Co-authored-by: Charles <charles-francis.damedey@savoirfairelinux.com>
Co-authored-by: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
Change-Id: I5bff3a811caa9bec8ee9b80733165aaaaae5db24
2023-08-18 17:15:33 -04:00
3a693536e4 MessageBar: Fixed issue where sending a message would break the layout.
Change-Id: Iacdea26427e48b00f9edd9aacf57f88860717e0c
2023-08-18 16:42:36 -04:00
ffcd3e59a4 incomingcall: use callstatechanged signal
To be able to show calls that are transfered, we must catch new calls
from callstatechanged signal. Move all logic from newincomingcall to
callstatechanged.

Change-Id: Ibd3ff5f8b4009895b3165348fd1638956f5f66d9
2023-08-08 10:48:50 -04:00
77935de893 welcomepage: fix title translation
Change-Id: Ied989089c59293802b16cf252a538f56d1fbc147
2023-08-08 10:20:37 -03:00
386ef224d1 jamistrings: cleanup
Change-Id: I10c7aa2c77a752c508821d018b7d54dfeb64d7df
2023-08-08 10:15:49 -03:00
d62c2ff98e misc: update title label
Change-Id: I2baa2915398803550fcc161aa7e1ce7cb59ca300
GitLab: #1293
2023-08-07 13:24:46 -04:00
3b00b42213 RTL: fix sparse side panel options
+ fix splitview width resize
+ fix tips row in the WelcomePage

GitLab: #1290
Change-Id: I458e6a96e496b35b7659c5a061949f135511a2e4
2023-08-04 15:06:22 -03:00
21f3479a96 messagebar: fix rtl layout
GitLab: #1279

Change-Id: I746fd86a4cf32cbb369ba2c5d57182800d7da0d0
2023-08-02 12:40:37 -03:00
8307089900 jamiid: change look of jami id to be more compact
Change-Id: I5f39b5f28d4447cdd5b10f37ad2d8780260d5ed8
2023-08-02 10:38:38 -04:00
2916b4c523 swarmdetailpanel: fix avatar position
Change-Id: I9a94c11056be4e176cb01400b2023021a98b6a51
GitLab: #1288
2023-08-02 09:01:37 -03:00
5530649f07 PluginStore: add view for plugin store
Gitlab: #1163
Change-Id: If9d9a27a296c5810b9f99126bed6453cc6ab6852
2023-08-01 13:42:49 -04:00
7581f9397a updateManager: create a plugin store and a plugin manager
Change-Id: I57ebec72c1cb6e2f245af011def82f880bc9573f
2023-08-01 13:42:49 -04:00
7f2c98a594 shortcuttable: update strings
Change-Id: I9428df58376a6cf84c9736d40b07db88089230d1
GitLab: #1282
2023-08-01 10:00:17 -04:00
6341f32618 updatemanager: refactor windows update and macos update manager
To be able to use an update manager for the plugins store, a refactor of windows update manager is done. The windows and macos update manager is used for updating jami. The plugins store update manager is to update plugins to the newest version.

Gitlab: #1229
Change-Id: I0541b6191401f2aa2c6d6034722796455e9c18d2
2023-07-31 15:46:16 -04:00
a652a3d20f messagelistview: fix isFirst/isLast with isEmojiOnly
Change-Id: I4f9a8b037c14e48f12f42f73f0b44b9a78945567
GitLab: #1198
2023-07-31 13:20:06 -04:00
46da989a59 settings: move link device button
Change-Id: Ibafb7afb3eb4fa373a02120ae3575254c645a5c8
GitLab: #1253
2023-07-31 12:56:56 -04:00
1a463ec662 misc: bump daemon
Change-Id: Ib2ad7deed9e27855c1dd6e7c75930a3d4f7f880c
2023-07-31 11:08:30 -04:00
aee632c967 misc: fix warning
Change-Id: I7fd957e621f5af1cc76b94c47fffc2523009fa52
2023-07-31 08:41:50 -04:00
e3a73ac932 TextEditor: General upgrade
Popup take text size according to languagePopup takes size of the text in fonction
Edition button are now colored when actif

GitLab: #1096
Change-Id: I4ddfe8de267a0e0582dde602aa2ad42f5cf535e8
2023-07-31 08:41:37 -04:00
416417d15a contactmessagedelegate: fix placement on resize
Change-Id: Icd84dcc248ee0097546a23eed03f4b1379337d0e
GitLab: #1268
2023-07-31 08:28:38 -04:00
36a36dadcf contextmenu: remove "Block contact" on self
https://git.jami.net/savoirfairelinux/jami-project/-/issues/1586

Change-Id: I9b86781869d80eda347659f0c009b8dfe09bdfd0
2023-07-31 08:28:24 -04:00
38735b052a whitelabeling: fix bug on custom color for background
Change-Id: I91544414664008b26397d041998da5c895b48d7a
2023-07-28 12:53:12 -04:00
5b984396cf whitelabeling: change color of text and icons to contrast with custom colors
Change-Id: Ie990bdf7e3ce5253eb55317d2d57a43dd7f543d7
2023-07-28 12:52:51 -04:00
22cd3d4d4e whitelabeling: fix problem when no custom logo in custom Ui
Change-Id: I3a90a20e1963277e72c3980bf5002c16a9a4f213
2023-07-28 12:52:36 -04:00
53811f93b2 misc: remove weird hovered animation on push buttons
Change-Id: Ibad1dd9a6ab8c780123a0342bd4cc138b04663c5
2023-07-28 09:47:16 -04:00
5e874f4f4b contextmenu: remove incorrect block contact
Change-Id: Ia3c72757c903e022f2cbf6d74fc0e0916cd83a94
GitLab: #1270
2023-07-28 09:47:16 -04:00
a5bf258476 swarmdetailspanel: always open on first tab option
Change-Id: If04bdf1b1398c04cdd980d28e0ee594b225ebc3d
GitLab: #1231
2023-07-28 08:20:34 -04:00
3b85425aa3 smartlist: don't reposition the view at the current index
Gitlab: #1273
Change-Id: I4a8cac7caef3c5935b65dacb35b4fc235525ca48
2023-07-27 11:37:38 -04:00
e8e9fd30c9 avatars: fix missing avatars
Strip whitespace for avatars pulled from conversation info.

Gitlab: #1246
Change-Id: I767a53ee3e492507f9cb80b802a9eaaaa66d3d50
2023-07-27 10:47:06 -04:00
e914f795bc i18n: automatic bump
Change-Id: Ia5ee4d6887d4680918ccd5d247dbfdf2197ee7f5
2023-07-27 10:07:14 -04:00
007b0c1132 i18n: fix configuration
+ Only look for translations in valid files.

Change-Id: I350478d050118c8b5d6bd127aaeed6c3965fe05f
GitLab: #1266
2023-07-27 09:59:43 -04:00
11f67c73c8 customizeprofilepage: fix double placeholder
Change-Id: I6628fe83c9818698cc6a2357ab283c97fc94ca31
2023-07-26 13:58:31 -04:00
01cbcbbb2c chatview: update image uri for contact avatar
Gitlab: #1267
Change-Id: I651232cbbf68997f8111c9374486bde4bd8ceeef
2023-07-26 12:50:38 -04:00
76fcd5f910 jamiidentifier: remove useless mask
Change-Id: Ie7e1ae5e5be9b710f53e21cf51385ae8addb54f6
2023-07-26 07:31:15 -04:00
38a3da38c5 i18n: automatic bump
Change-Id: I133ca9ec80aa8ff6a967dd1a4eaf22330fa89279
2023-07-24 16:42:32 -04:00
f0b78036e3 ModalTextEdit: add required placeHolder
Change-Id: I7e450a3f68176bd67801700b621ff6f076531193
2023-07-24 10:44:57 -04:00
2f7acbd31b whitelabeling: change welcomePage to take into account ui customization
GitLab: #1097
Change-Id: I8967146c3ca04daee96b4a4fb10bcb6811c1c7a4
2023-07-19 16:46:32 -04:00
8c1b214619 replytorow: fix message size
Change-Id: I5fd6054a1ac2e409a3ddecef82ec656ad5639e98
2023-07-19 13:00:04 -04:00
e3e4de0fe7 misc: remove unused method
Change-Id: Ib58dabb342a293a1e4e699fcb75b1b04e5541bc4
2023-07-19 11:02:12 -04:00
452d49a439 settings: remove RTP fallback
As not present in other clients and if SDES is enabled, all calls
must be in SRTP. Else UX would be unclear.

Change-Id: If756f8738ef08109aa7fbf8cbcade3b4f4792093
GitLab: #1263
2023-07-19 10:54:35 -04:00
f53c2be978 MediaSettings: pass arguments to method
Change-Id: I9c751dbc1e9557b95c8d34e80e1e43cbe26d57d4
2023-07-18 14:53:17 -04:00
36e5bdb839 i18n: automatic bump
Change-Id: I3050e54142fd9bd9a59e2a5c18adbe3fcf82d8d5
2023-07-18 14:16:45 -04:00
b54cb31d75 misc: fix typo on formatting
Change-Id: I35a0791ba0c8cc906ac441c7afb588e40b1be5c5
2023-07-18 11:16:17 -04:00
5134160539 misc: bump daemon submodule
Change-Id: Idc2990e82ef0f87b07f79a576390c4b1d99051ed
2023-07-17 15:03:27 -04:00
a9ad7d0bde Plugins: fix unavailable view
Plugins settings view is unavailable due to missing QML_REGISTERTYPE
removed at ec0feef74d.

Change-Id: I07d7fef42e9c25d6ee867f7c682286ea3c52a863
2023-07-17 14:47:53 -03:00
6a1a9b60aa MessageBar: do not show sendFile/Location for a SIP account
Change-Id: I4f2fc87c2ec1083605f8a287eecac67ff950c821
2023-07-17 07:48:25 -04:00
61126cfa64 messageparser: replace regexes with tidy API
Depend on tidy API for attribute extraction rather than regexes.

1. htmlparser methods return nodes instead of pre-parsed strings
2. htmlparser provides some methods to extract text/attr from nodes

Gitlab: #1248
Change-Id: I367d703680938fb0b7c5055ac41e079c1322da30
2023-07-14 13:32:20 -04:00
ec0feef74d CachedImage: add icon downloader for pluginstore and welcome page
Gitlab: #1228
Gitlab: #1166

Change-Id: I0117cecdb8a77ded8f3da3c2f25028012002a285
2023-07-14 07:57:45 -04:00
eff76eddc7 buttons: remove bold effect
Change-Id: Ie483a9af270990622b876ca44a975d915e458783
GitLab: #1236
2023-07-13 15:44:07 -04:00
83039abc1b TextEditor: General upgrade
Implement new design
Add multiline button
Use correct color and implement dark theme

GitLab: #1096
Change-Id: I5699c81fbc41e50300ca8b32b93ee47cd17ceee1
2023-07-13 13:48:00 -04:00
bbdd68fb1d misc: fix isRTL function
Uses the system locale name when the preference is set to "SYSTEM".
Adds some extra ISO 639-1 RTL languages.

Change-Id: Ia28ae1bc15992ce26f88ab11bc447d76054f0581
2023-07-13 11:11:59 -04:00
afc0423bf6 swarmdetailspanel: avoid bugguy column layout
Since Qt 6.4, some layout are bugguy causing bad positioning.
(Even some examples in Qt's doc are incorrect)
So, use anchors instead.

Change-Id: Id0f0175208312b6e4b9fe503d8713c7ff037024a
GitLab: #1217
2023-07-13 09:39:24 -04:00
0b18f3d145 swarmdetailspanel: fix identifier row
also separate debug and muteDaemon options so that "jami -dq" shows
debug informations from the client.

Change-Id: Ic69c5cf8b6a8ef4aa1fff607d01a541dab3e6da2
2023-07-13 09:39:19 -04:00
593ecc9910 whitelabeling: add uicustom info in account property
GitLab: #1097

Change-Id: I1f7db2b14c437d033264ff58457d8067e4ff6c05
2023-07-11 14:34:31 -04:00
8fd7c70d1f wizardview: manage through MainView
Change-Id: I083d293784e07f4fcc099e60ada84e433a1b2fa0
GitLab: #1216
2023-07-11 08:05:56 -04:00
e71c1d1729 i18n: automatic bump
Change-Id: I9af964c0078f96730c42ee525ce23e1a83850579
2023-07-10 16:42:30 -04:00
207872244b moderatorlistmodel: fix refresh on account change
Change-Id: Ib689e97d903a42fc241f505e3fb5f37c155c65f9
GitLab: #1122
2023-07-10 07:41:54 -04:00
03b3530d3d conversationmodel: specify "you" for self-user in title
Change-Id: I01d2cd868c7f1c513290792b5f8bff0f6a110f0e
GitLab: #1250
2023-07-07 13:29:28 -04:00
a7bd860e2b Doc: Clarification of install.md instructions
GitLab: #1168

Change-Id: I478b7db6fd6438ed3a35defcc9a7b3e5e7176f32
2023-07-07 13:02:52 -04:00
df9c4b0653 materialradiobutton: update radius
Change-Id: I00feb393feeb1c7e17dccfd75209b00de6e75e4f
GitLab: #1241
2023-07-07 11:12:30 -04:00
d2eed3af64 chatview timestamp: update colors
+ update scroll to bottom button radius
GitLab: #1244

Change-Id: I76ef89123a9a1dfc521aff2983bd46288abab698
2023-07-07 10:54:14 -03:00
f0eb826b64 contactmessagebase: update design
Also move all spacing in TimeStampInfo, so sequences doesn't have
weird spacing and can better be controlled.

GitLab: #1243
Change-Id: Ica7235856c3a7ed38ed3e390c4bf14decede25b0
2023-07-07 08:35:01 -04:00
2ed89fec3c materialbutton: group hoverEnabled and enabled
The hover animation was shown on disabled buttons

Change-Id: I2d8579a1d712e785b8edc82472df6ac798f1b523
GitLab: #1247
2023-07-07 07:53:34 -04:00
281516823e chatviewheader: keep button selected when linked tab is opened
Change-Id: I5b4df32352bc1e6e5281a18e16c8da902242bc4f
GitLab: #1233
2023-07-07 07:43:33 -04:00
a2d110740d swarmdetailspanel: avoid bugguy column layout
Since Qt 6.4, some layout are bugguy causing bad positioning.
(Even some examples in Qt's doc are incorrect)
So, use anchors instead.

Change-Id: Iebb47b8c7e694049ba297609a12bcf43db7dddd3
GitLab: #1217
2023-07-07 07:32:16 -04:00
ad14302ac5 macOS: remove unnecessary permission for photo library access
This commit removes a permission that is not needed, as the photo
library is not accessed in the code.

Change-Id: I47a3af739252733e3e8a2379b417396b2b67578c
2023-07-06 14:48:25 -04:00
f903c635a7 EmojiPicker: close popup when repress the button
Fixing issues where clicking a second time on
the emoji button open a second popup instead
of closing the first one

GitLab: #1249
Change-Id: I76f0094c4024ae27f260e6aeba93522d3709feef
2023-07-06 11:30:49 -04:00
5582d39a3f settings: update selected colors
Change-Id: I18191ef1a4e5e3a62d509e3871ea33550951e690
GitLab: #1237
2023-07-06 11:30:12 -04:00
4f1e04a9b9 HoveredButton: homogenise effects on hovering
Creating a JamiPushButton in oder to regroup definition
Color correction
Homogenization of the other button (Layout QR Code, Settings, and Hide conversation)

GitLab: #1209
Change-Id: If9f891dba1c1d4e83aaebc16a2202dc2a3b719f2
2023-07-05 11:43:05 -04:00
7514d75242 conversationmodel: ignore notifications from muted conversations
This use case has been observed when taking a look at the system tray
icon, which uses conversation model's notificationsCount() to define
whether or not to show a red dot. As we don't want this for muted
conversations these are ignored.

Change-Id: Ic185de9170dfcbfbd8ffc3513676dd90471f3baa
2023-07-04 16:23:35 -04:00
fe2f3258b2 Popup : Close all popups by pressing escape
Using a key OnPressed instead of Shortcut
Making all popups closable with escape (focus true and a close policy)

GitLab: #1234
Change-Id: I1a612834c439aea94a59e91cb915b18b4ef5cf84
2023-07-04 14:30:23 -04:00
c8ec980a3b misc: invert horizontal and vertical view labels
Change-Id: Ic00b2f5073ee3c3b866c8042be3c19993d446699
GitLab: #1142
2023-07-04 08:39:55 -04:00
cb0e45c3fa swarmdetailspanel: reorder tabbar options
Change-Id: Idf6e9c41148b29b3d3a31ecc3b3ae55c551433bf
GitLab: #1231
2023-07-04 08:21:35 -04:00
532bf6c4ad i18n: automatic bump
Change-Id: I8be71ba4848f90f034f9bc81318cba739c9865f2
2023-07-03 16:42:32 -04:00
d7200cc8a3 ChatViewFooter : use Escape for closing box
Closing emoji box, record box and location box by pressing Esc Key
Using opened that already exists instead of creating isOpen

GitLab: #1197
Change-Id: I8461a7f2e8acaffe4ab66647d3e98701c608f270
2023-06-29 08:08:11 -04:00
3383f43688 chatview: update font sizes and margin
Change-Id: I8186083bbe0854dfa6e1d48b61b14b4aef6d135b
GitLab: #1213
2023-06-28 11:42:44 -04:00
26212b21b2 i18n: automatic bump
Change-Id: I874ad3f1ad9181105cb538349862535a2a9f0677
2023-06-28 08:48:46 -04:00
136f365fe2 fix: avoid crash when deleting account
GitLab: #1173
Change-Id: Id30f259ce286ea8fb76af5aee59ed49edb99011a
2023-06-28 01:30:00 -04:00
2145ee6229 callsettings: correctly get isSIP property
Change-Id: I3512cc9890207f2322d7d843e2137dc09d77ebe5
GitLab: #1207
2023-06-27 15:44:13 -04:00
0f66152d72 build.py: allow initialization without installing pre-commit hook
Gitlab: #1219
Change-Id: I5a2e2099d6ad1b551e2d744ffbf800b79c36a821
2023-06-27 14:59:52 -04:00
24a0a384ff contactmodel: no need to call both addContact/acceptConversationRequest
only acceptConversationRequest is enough to accept a request

Change-Id: I4720ea70def6cd35153167ef9577b1c7528e7140
2023-06-27 13:54:19 -04:00
97297eacf7 jamitheme: update color bubble
Change-Id: Ib7bf909811675dc50c3f964feee93191f8d43338
GitLab: #1212
2023-06-27 13:54:19 -04:00
5a70c7e7e8 misc: fix some overlap issues
+ Fix the password entry for linking a new device with password
+ Fix the linked devices page with a lot of devices
+ Fix the add default moderators popup

Change-Id: I1bac4bd8f55dd91825278399fe39f3503e153edb
GitLab: #886
2023-06-27 13:45:07 -04:00
7931d66b81 calloverlay: don't load call action item models when not visible
Gitlab: #1173
Change-Id: I912cb7a16eb22de188350a741efeaa7e23d99d9b
2023-06-27 11:46:59 -04:00
9fd48580bb i18n: automatic bump
Change-Id: I9df6e8bcd1e599e65508e04d183c558c0d9c9978
2023-06-26 10:25:58 -04:00
1789402949 currentconversation: untick mute conversation setting if unset
Change-Id: I3c0586d17cbb72b0a71886f40409e97d8a37502a
GitLab: #1218
2023-06-22 14:32:23 -04:00
2546b69343 networkmanager: changed handle error in sendGetRequest
Change-Id: I3f3b963b7443a5319799e6f6430f9ddd22414d5f
2023-06-22 14:18:52 -04:00
fb420b2ff7 addmemberpanel: simplify and avoid extra model resets
Change-Id: I3989f386127c55c224311afc0aa0b89303579dec
2023-06-22 09:04:39 -04:00
8a7547aaba smartList: update underlying model
This patch ensures the underlying model is updated whenever
a new conversation is added or removed. This will prevent a
possible crash when the model gets invalidated.

GitLab: #1210
Change-Id: I2bd6f396a6ea09ddd357a567456a057ac1805734
2023-06-21 17:10:47 -04:00
9fe34c5282 i18n: automatic bump
Change-Id: Ib40a6b0eb8fb1d96eb6326f2fbfc8059ea434ac7
2023-06-19 13:30:00 -04:00
b948646cbd misc: bump libjami version
Change-Id: I0cc0e0b798f8f79aa6c8686716848a10c167b2b7
2023-06-19 11:40:22 -04:00
21c4afa564 makefile: remove fedora_36
Change-Id: I006e3d940066510dd2831371d9940360a6149276
2023-06-19 10:29:49 -04:00
41b9e541bb JamiIdentifier: reset edit status on account changes
Change-Id: Ifc2c5380b035c10ec188e2b643d87cca9478cd51
GitLab: #1180
2023-06-19 07:55:34 -04:00
e867b578bf positionmanager: fix signature
Change-Id: I68b830eeb775ed043c617db838a5160213152720
GitLab: #1194
2023-06-19 07:55:14 -04:00
944a20b2f3 swarmdetailspanel: remove incorrect margins on members list
Change-Id: Iffc1ee897507aa11ff845686123a14a94c39ba80
GitLab: #1175
2023-06-19 07:54:44 -04:00
7f4e3c4739 JamiIdentifier: fix reduction overflow
GitLab: #1146
Change-Id: Icafcded965e4517ffd01301ad6f11fbc9d404911
2023-06-15 15:50:22 -04:00
2ef5dcae71 packaging: deprecate fedora 36 (eol) - add debian 12
Change-Id: Ibc7d68a651b5f0ba488d6f45e910ddbe339568a2
2023-06-15 09:26:41 -04:00
ad4d7aecc3 ManageAccountPage: no bug on view when resize the view
Gitlab: #886

Change-Id: Ib3d260271d951a16b63db1ac4a0c3c29a4d87f52
2023-06-15 09:11:56 -04:00
388ad92d96 message panel: update location button visibility
Disable the location sharing button when building without
WebEngine.

Change-Id: I62494147a26035a507742e5e80a85e3c044bc3ff
2023-06-14 15:54:58 -04:00
c37ec740e2 misc: fix click on remove conversation
https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/855
Change-Id: I2c0caa3db05c663c5ee23367774c987aeca3324f
2023-06-14 15:41:38 -04:00
cb31ea3575 messagesadapter: fix click on reply header
The signature was incorrect

Change-Id: I35454bd96cea2d2eb959a80605375e1eb962a0da
2023-06-14 15:41:38 -04:00
a27c344cb7 misc: clarify log
Change-Id: I66b2b8cb1c289575b5568cc40f7402282bede314
2023-06-14 15:41:38 -04:00
a65c4f28e1 snap: add libsystem-dev
Change-Id: I2d337149bf2ef8c7807bbb2562e35cc05e3dbbba
2023-06-14 08:07:05 -04:00
322 changed files with 311320 additions and 310531 deletions

View File

@ -3,6 +3,5 @@ host = https://www.transifex.com
[o:savoirfairelinux:p:jami:r:jami_client_qt]
file_filter = translations/jami_client_qt_<lang>.ts
source_file = translations/jami_client_qt.ts
source_lang = en
source_file = translations/jami_client_qt_en.ts
type = TS

View File

@ -74,16 +74,19 @@ set(TESTS_DIR ${PROJECT_SOURCE_DIR}/tests)
# Here we let find_package(<PackageName>...) try to find Qt 6,
# If it is found, find_package will succeed, and the CMake variable
# QT_VERSION_MAJOR will be defined 6.
set(QT6_MINVER_MINOR 4)
if(QT6_VER AND QT6_PATH)
find_package(QT NAMES Qt6 REQUIRED
PATHS ${QT6_PATH} NO_DEFAULT_PATH)
else()
message(STATUS "Looking for Qt 6" ${CMAKE_PREFIX_PATH})
find_package(QT NAMES Qt6 REQUIRED)
endif()
if (${QT_VERSION_MAJOR} STRLESS 6)
if (${QT_VERSION_MINOR} STRLESS 4)
message(FATAL_ERROR "Qt 6.4 or higher is required.")
endif()
if (${QT_VERSION_MINOR} GREATER_EQUAL ${QT6_MINVER_MINOR})
# Qt version is 6.4 or higher
message(STATUS "Found a suitable Qt version ${QT_VERSION}")
else()
message(FATAL_ERROR "Qt 6.4 or higher is required. Found ${QT_VERSION}")
endif()
if(MSVC)
@ -206,6 +209,7 @@ set(COMMON_SOURCES
${APP_SRC_DIR}/pluginadapter.cpp
${APP_SRC_DIR}/deviceitemlistmodel.cpp
${APP_SRC_DIR}/pluginlistmodel.cpp
${APP_SRC_DIR}/pluginstorelistmodel.cpp
${APP_SRC_DIR}/pluginhandlerlistmodel.cpp
${APP_SRC_DIR}/preferenceitemlistmodel.cpp
${APP_SRC_DIR}/mediacodeclistmodel.cpp
@ -238,13 +242,15 @@ set(COMMON_SOURCES
${APP_SRC_DIR}/positioning.cpp
${APP_SRC_DIR}/currentcall.cpp
${APP_SRC_DIR}/messageparser.cpp
${APP_SRC_DIR}/previewengine.cpp)
${APP_SRC_DIR}/previewengine.cpp
${APP_SRC_DIR}/imagedownloader.cpp
${APP_SRC_DIR}/pluginversionmanager.cpp)
set(COMMON_HEADERS
${APP_SRC_DIR}/avatarimageprovider.h
${APP_SRC_DIR}/networkmanager.h
${APP_SRC_DIR}/smartlistmodel.h
${APP_SRC_DIR}/updatemanager.h
${APP_SRC_DIR}/appversionmanager.h
${APP_SRC_DIR}/utils.h
${APP_SRC_DIR}/bannedlistmodel.h
${APP_SRC_DIR}/version.h
@ -266,6 +272,7 @@ set(COMMON_HEADERS
${APP_SRC_DIR}/pluginadapter.h
${APP_SRC_DIR}/deviceitemlistmodel.h
${APP_SRC_DIR}/pluginlistmodel.h
${APP_SRC_DIR}/pluginstorelistmodel.h
${APP_SRC_DIR}/pluginhandlerlistmodel.h
${APP_SRC_DIR}/preferenceitemlistmodel.h
${APP_SRC_DIR}/mediacodeclistmodel.h
@ -301,7 +308,10 @@ set(COMMON_HEADERS
${APP_SRC_DIR}/positioning.h
${APP_SRC_DIR}/currentcall.h
${APP_SRC_DIR}/messageparser.h
${APP_SRC_DIR}/htmlparser.h)
${APP_SRC_DIR}/htmlparser.h
${APP_SRC_DIR}/imagedownloader.h
${APP_SRC_DIR}/pluginversionmanager.h)
# For libavutil/avframe.
set(LIBJAMI_CONTRIB_DIR "${DAEMON_DIR}/contrib")
@ -333,7 +343,7 @@ if(MSVC)
list(APPEND COMMON_SOURCES
${APP_SRC_DIR}/connectivitymonitor.cpp
${APP_SRC_DIR}/updatemanager.cpp)
${APP_SRC_DIR}/appversionmanager.cpp)
# preprocessor defines
add_definitions(-DUNICODE -DQT_NO_DEBUG -DNDEBUG)
@ -385,7 +395,7 @@ elseif (NOT APPLE)
${APP_SRC_DIR}/xrectsel.c
${APP_SRC_DIR}/connectivitymonitor.cpp
${APP_SRC_DIR}/dbuserrorhandler.cpp
${APP_SRC_DIR}/updatemanager.cpp)
${APP_SRC_DIR}/appversionmanager.cpp)
list(APPEND COMMON_HEADERS
${APP_SRC_DIR}/xrectsel.h
${APP_SRC_DIR}/dbuserrorhandler.h)
@ -437,7 +447,7 @@ elseif (NOT APPLE)
find_library(X11 X11)
else() # APPLE
list(APPEND COMMON_SOURCES
${APP_SRC_DIR}/os/macos/updatemanager.mm
${APP_SRC_DIR}/os/macos/appversionmanager.mm
${APP_SRC_DIR}/os/macos/connectivitymonitor.mm
${APP_SRC_DIR}/os/macos/macutils.mm)
list(APPEND COMMON_HEADERS

View File

@ -11,32 +11,38 @@ Because the client-qt is multi-platforms and supporting macOS, we need a recent
This version is generally not packaged on a lot of platforms, and to control available plugins and such, we have our own Qt packaged (available on https://jami.net on the distributions we support).
So, you will need to get Qt 6.4 first. For this, there is 3 methods:
### Qt from https://jami.net (recommended)
### Qt from our repo (recommended)
If your distribution is supported, we provide a Qt package (libqt-jami) on our repo.
The files will be installed in `/usr/lib/libqt-jami`.
#### Install libqt-jami, Debian based
```
sudo apt install gnupg dirmngr ca-certificates curl --no-install-recommends
curl -s https://dl.jami.net/public-key.gpg | sudo tee /usr/share/keyrings/jami-archive-keyring.gpg > /dev/null
sudo sh -c "echo 'deb [signed-by=/usr/share/keyrings/jami-archive-keyring.gpg] https://dl.jami.net/nightly/debian_<VERSION>/ jami main' > /etc/apt/sources.list.d/jami.list"
sudo apt-get update && sudo apt-get install libqt-jami
```
#### Install libqt-jami, Ubuntu based
```
To install libqt-jami on Ubuntu, execute these commands replacing `ubuntu_<VERSION>` by your distribution version. For example "ubuntu_22.04"
```bash
sudo apt install gnupg dirmngr ca-certificates curl --no-install-recommends
curl -s https://dl.jami.net/public-key.gpg | sudo tee /usr/share/keyrings/jami-archive-keyring.gpg > /dev/null
sudo sh -c "echo 'deb [signed-by=/usr/share/keyrings/jami-archive-keyring.gpg] https://dl.jami.net/nightly/ubuntu_<VERSION>/ jami main' > /etc/apt/sources.list.d/jami.list"
sudo apt-get update && sudo apt-get install libqt-jami
```
#### Install libqt-jami, Debian based
To install libqt-jami on Debian, execute these commands replacing `debian_<VERSION>` by your distribution version. For example "debian_11"
```bash
sudo apt install gnupg dirmngr ca-certificates curl --no-install-recommends
curl -s https://dl.jami.net/public-key.gpg | sudo tee /usr/share/keyrings/jami-archive-keyring.gpg > /dev/null
sudo sh -c "echo 'deb [signed-by=/usr/share/keyrings/jami-archive-keyring.gpg] https://dl.jami.net/nightly/debian_<VERSION>/ jami main' > /etc/apt/sources.list.d/jami.list"
sudo apt-get update && sudo apt-get install jami
```
#### Install jami-libqt, Fedora based
```
To install libqt-jami on Fedora, execute these commands replacing `fedora_<VERSION>` by your distribution version. For example "fedora_38"
```bash
sudo dnf config-manager --add-repo https://dl.jami.net/nightly/fedora_<VERSION>/jami-nightly.repo
sudo dnf update && sudo dnf install jami-libqt
```
@ -49,7 +55,7 @@ It should be (For now qt5 only is packaged by distributions, so names can change
#### Dependencies, Debian based
```
```bash
sudo apt-get install cmake make doxygen g++ gettext libnotify-dev pandoc nasm libqrencode-dev \
libnotify-dev libnm-dev \
qt6-base-dev \
@ -66,7 +72,7 @@ sudo apt-get install cmake make doxygen g++ gettext libnotify-dev pandoc nasm li
#### Dependencies, Fedora based
```
```bash
sudo dnf install qt6-qtsvg-devel qt6-qtwebengine-devel qt6-qtmultimedia-devel qt6-qtdeclarative-devel qt6-qtquickcontrols2-devel qt6-qtquickcontrols qrencode-devel NetworkManager-libnm-devel
```
@ -87,8 +93,13 @@ for getting the latest development versions; otherwise, you can use
`git submodule update --init` then checkout specific commits for each
submodule).
If you're a developer you need to install clang-format separately before initializing with the command
```bash
./build.py --init --qt=<path/to/qt> # qt path is required for qmlformatting to work
sudo apt install clang-format
```
```bash
./build.py --init [--qt=<path/to/qt> (this is required for qmlformatting to work)]
```
Then you will need to install dependencies:
@ -96,7 +107,7 @@ Then you will need to install dependencies:
- For GNU/Linux
```bash
./build.py --dependencies # needs sudo
sudo ./build.py --dependencies
```
Then, you can build daemon and the client using:

View File

@ -329,7 +329,7 @@ def run_init(args):
# The client submodule has QML files, so we need to run qmlformat on it,
# and thus need to supply the Qt path.
execute_script([f'{format_script} --install {client_hooks_dir}'
f' --qt {args.qt}' if args.qt else ''],
f' --qt {args.qt}'],
{"path": client_hooks_dir})
# The daemon submodule has no QML files, so we don't need to run
@ -416,6 +416,11 @@ def run_install(args):
command = ['extras/scripts/install.sh'] + install_args
if 'TARBALLS' not in os.environ:
print('info: consider setting the TARBALLS environment variable '
'to a stable writable location to avoid loosing '
'cached tarballs')
if args.distribution == 'guix':
if args.global_install:
print('error: global install is not supported when using Guix.')
@ -425,10 +430,6 @@ def run_install(args):
if 'TARBALLS' in os.environ:
share_tarballs_args = ['--preserve=TARBALLS',
f'--share={os.environ["TARBALLS"]}']
else:
print('info: consider setting the TARBALLS environment variable '
'to a stable writable location to avoid loosing '
'cached tarballs')
command = ['guix', 'shell', f'--manifest={GUIX_MANIFEST}',
'--symlink=/usr/bin/env=bin/env',
'--symlink=/etc/ssl/certs=etc/ssl/certs',

2
daemon

Submodule daemon updated: d3fe2b9849...86d147d080

View File

@ -161,13 +161,12 @@ endif
#
DISTRIBUTIONS := \
debian_11 \
debian_12 \
debian_testing \
debian_unstable \
ubuntu_20.04 \
ubuntu_22.04 \
ubuntu_22.10 \
ubuntu_23.04 \
fedora_36 \
fedora_37 \
fedora_38 \
opensuse-leap_15.4 \

View File

@ -1,4 +1,4 @@
FROM ubuntu:22.10
FROM debian:bookworm
ENV DEBIAN_FRONTEND=noninteractive

View File

@ -1,104 +0,0 @@
FROM fedora:36
RUN dnf clean all
RUN dnf install -y dnf-command\(builddep\) rpmdevtools && \
dnf install -y mock
RUN dnf groupinstall -y "X Software Development"
RUN dnf install -y \
git \
rpm-build \
tar \
make \
autoconf \
automake \
nasm \
speexdsp-devel \
pulseaudio-libs-devel \
libcanberra-devel \
libcurl-devel \
libtool \
mesa-libgbm-devel \
mesa-dri-drivers \
dbus-devel \
expat-devel \
pcre-devel \
yaml-cpp-devel \
libXext-devel \
libXfixes-devel \
yasm \
python2.7 \
python3-html5lib \
speex-devel \
gsm-devel \
chrpath \
check \
astyle \
uuid-c++-devel \
gettext-devel \
gcc-c++ \
which \
alsa-lib-devel \
systemd-devel \
libuuid-devel \
uuid-devel \
gnutls-devel \
nettle-devel \
opus-devel \
patch \
jsoncpp-devel \
libnatpmp-devel \
webkitgtk4-devel \
cryptopp-devel \
libva-devel \
libvdpau-devel \
msgpack-devel \
NetworkManager-libnm-devel \
openssl-devel \
clutter-devel \
clutter-gtk-devel \
libappindicator-gtk3-devel \
libnotify-devel \
libupnp-devel \
qrencode-devel \
libargon2-devel \
libsndfile-devel \
libdrm \
gperf \
bison \
clang \
clang-devel \
llvm-devel \
nodejs \
flex \
gstreamer1 gstreamer1-devel \
gstreamer1-plugins-base-devel \
gstreamer1-plugins-good \
gstreamer1-plugins-bad-free-devel \
nss-devel \
libxcb* \
libxkb* \
libX11-devel \
vulkan-devel \
libXrender-devel \
xcb-util-* \
xz \
xkeyboard-config \
libnotify \
wget \
libstdc++-static \
sqlite-devel \
perl-generators \
perl-English \
libxshmfence-devel \
ninja-build \
clang \
cmake \
fmt-devel \
cups-devel #Chromium for Qt
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
CMD ["/opt/build-package-rpm.sh"]

View File

@ -93,12 +93,12 @@ if [ -f /etc/os-release ]; then
# Set-up Jami repository end tag
if [ "${VERSION_CODENAME}" = "bullseye" ] || [ "${ID}_${VERSION_ID}" = "debian_11" ]; then
ENDTAG="debian_11"
elif [ "${VERSION_CODENAME}" = "bookworm" ] || [ "${ID}_${VERSION_ID}" = "debian_12" ]; then
ENDTAG="debian_12"
elif [ "${UBUNTU_CODENAME}" = "focal" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_20.04" ]; then
ENDTAG="ubuntu_20.04"
elif [ "${UBUNTU_CODENAME}" = "jammy" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_22.04" ]; then
ENDTAG="ubuntu_22.04"
elif [ "${UBUNTU_CODENAME}" = "kinetic" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_22.10" ]; then
ENDTAG="ubuntu_22.10"
elif [ "${UBUNTU_CODENAME}" = "lunar" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_23.04" ]; then
ENDTAG="ubuntu_23.04"
elif [ "${ID}" = "debian" ] && \

View File

@ -308,7 +308,7 @@ parts:
- libexpat1-dev
- libjsoncpp-dev
- libnm-dev # connectivityChanged()
- libdbus-1-dev # dbus
- libsystemd-dev # sdbus-cpp
- libpulse-dev # pulse
- libudev-dev
- libopus-dev # Avoid to build opus from contrib

View File

@ -22,7 +22,7 @@ import shutil
from platform import uname
CFVERSION = "9"
CLANGFORMAT = ""
CLANGFORMAT = None
QMLFORMAT = None
@ -138,27 +138,29 @@ def main():
args = parser.parse_args()
if args.type in ["cpp", "both"]:
if not command_exists("clang-format-" + CFVERSION):
if not command_exists("clang-format"):
print("Required version of clang-format not found")
sys.exit(1)
else:
CLANGFORMAT = "clang-format"
else:
CLANGFORMAT = "clang-format-" + CFVERSION
if command_exists("clang-format-" + CFVERSION):
CLANGFORMAT = "clang-format-" + CFVERSION
elif command_exists("clang-format"):
CLANGFORMAT = "clang-format"
if CLANGFORMAT is not None:
print("Using source formatter: " + CLANGFORMAT)
else:
print("clang-format not found. can't format source files")
if args.qt is not None and args.type in ["qml", "both"]:
global QMLFORMAT # pylint: disable=global-statement
QMLFORMAT = find_qmlformat(args.qt)
if QMLFORMAT is not None:
print("Using qmlformatter: " + QMLFORMAT)
else:
print("No qmlformat found, can't format QML files")
if QMLFORMAT is not None:
print("Using qmlformatter: " + QMLFORMAT)
else:
print("qmlformat not found, can't format QML files")
if args.install:
install_hook(args.install, args.qt)
if CLANGFORMAT is not None or QMLFORMAT is not None:
install_hook(args.install, args.qt)
else:
print("No formatters found, skipping hook install")
sys.exit(0)
src_files = get_files([".cpp", ".cxx", ".cc", ".h", ".hpp"],

View File

@ -10,4 +10,4 @@ if (-not(Test-Path -Path $QtDir)) {
$lupdate = "$QtDir\bin\lupdate.exe"
$tsFileNames = Get-ChildItem -Path "$clientDir\translations" -Recurse -Include *.ts
Invoke-Expression("$lupdate $clientDir\src -ts $tsFileNames -no-obsolete")
Invoke-Expression("$lupdate -extensions cpp,h,qml $clientDir\src -ts $tsFileNames -no-obsolete")

View File

@ -34,8 +34,6 @@
<string>Jami requires to access your camera to make calls and record video</string>
<key>NSMicrophoneUsageDescription</key>
<string>Jami requires to access your microphone to make calls and record audio</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Jami requires to access your photo library to show image on profile and send via chat</string>
<key>ITSAppUsesNonExemptEncryption</key>
<true/>
</dict>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<g id="noun-overview-4287788" transform="translate(-112.49 -112.51)">
<path id="Path_272" d="M134.5,133.4l-3.5-3.5c3.3-3.9,2.8-9.8-1.1-13.2c-3.9-3.3-9.8-2.8-13.2,1.1c-3.3,3.9-2.8,9.8,1.1,13.2
c3.5,2.9,8.6,2.9,12.1,0l3.5,3.5L134.5,133.4z M123.8,131.6c-4.3,0-7.8-3.5-7.8-7.8s3.5-7.8,7.8-7.8c4.3,0,7.8,3.5,7.8,7.8l0,0
C131.6,128.2,128.1,131.6,123.8,131.6L123.8,131.6z"/>
<path id="Path_273" d="M123.8,119.7c-3.5,0-6.2,1.8-6.2,4.1s2.7,4.1,6.2,4.1c3.5,0,6.2-1.8,6.2-4.1S127.3,119.7,123.8,119.7z
M123.8,126.6c-2.6,0-4.8-1.3-4.8-2.8s2.2-2.8,4.8-2.8c2.6,0,4.8,1.3,4.8,2.8S126.5,126.6,123.8,126.6z"/>
<path id="Path_274" d="M126.1,123.9c0,1.3-1,2.3-2.3,2.3c-1.3,0-2.3-1-2.3-2.3c0-1.3,1-2.3,2.3-2.3
C125.1,121.6,126.1,122.6,126.1,123.9L126.1,123.9"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<path d="M5.8,4.7h12.5c0.7,0,1.2,0.6,1.2,1.2v7.5c0,0.7-0.6,1.2-1.2,1.2h-12l2.9-2.9l-1.8-1.8l-5,5c-0.1,0.1-0.2,0.3-0.3,0.4
c-0.2,0.5-0.1,1,0.3,1.4l5,5L9.1,20l-2.9-2.9h12c2.1,0,3.7-1.7,3.7-3.7V5.9c0-2.1-1.7-3.7-3.7-3.7H5.8V4.7z"/>
</svg>

After

Width:  |  Height:  |  Size: 582 B

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<path d="M20.9,4.6H15V4.2C15,3,14,2,12.8,2h-1.6C10,2,9,3,9,4.2v0.3H3.1c-0.4,0-0.7,0.3-0.7,0.7s0.3,0.7,0.7,0.7h1.4l0.7,13.8
C5.2,21,6.3,22,7.6,22h8.9c1.3,0,2.4-1,2.4-2.3l0.7-13.8h1.4c0.4,0,0.7-0.3,0.7-0.7S21.3,4.6,20.9,4.6z M10.3,4.6V4.2
c0-0.5,0.4-0.8,0.8-0.8h1.6c0.5,0,0.8,0.4,0.8,0.8v0.3H10.3z M18.1,5.9l-0.7,13.7c0,0.6-0.5,1-1,1H7.6c-0.6,0-1-0.4-1-1L5.8,5.9
H18.1z"/>
</svg>

After

Width:  |  Height:  |  Size: 726 B

View File

@ -0,0 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" width="26.503" height="26.5" viewBox="0 0 26.503 26.5">
<g id="noun-backup-2912773" transform="translate(-51.27 -51.32)">
<path id="Path_259" data-name="Path 259" d="M76.04,60.533H53a1.483,1.483,0,0,1-1.482-1.482v-6A1.483,1.483,0,0,1,53,51.57H76.04a1.483,1.483,0,0,1,1.482,1.482v6A1.483,1.483,0,0,1,76.04,60.533ZM53,52.014a1.038,1.038,0,0,0-1.037,1.037v6A1.038,1.038,0,0,0,53,60.089H76.04a1.038,1.038,0,0,0,1.037-1.037v-6a1.038,1.038,0,0,0-1.037-1.037Z" fill="#005699" stroke="#005699" stroke-width="0.5"/>
<path id="Path_260" data-name="Path 260" d="M72.468,779.243H53.042a1.483,1.483,0,0,1-1.482-1.482v-6a1.483,1.483,0,0,1,1.482-1.482h16.2a.222.222,0,1,1,0,.444h-16.2A1.038,1.038,0,0,0,52,771.762v6a1.038,1.038,0,0,0,1.037,1.037H72.468a.222.222,0,1,1,0,.444Z" transform="translate(-0.039 -701.673)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
<path id="Path_261" data-name="Path 261" d="M723.843,728.9a5.093,5.093,0,1,1,5.093-5.093,5.1,5.1,0,0,1-5.093,5.093Zm0-9.741a4.649,4.649,0,1,0,3.079,1.166A4.642,4.642,0,0,0,723.843,719.156Z" transform="translate(-651.414 -651.328)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
<path id="Path_262" data-name="Path 262" d="M77.382,423.416a.222.222,0,0,1-.222-.222V412.138a.76.76,0,0,0-.759-.759H52.807a.76.76,0,0,0-.759.759v6.556a.76.76,0,0,0,.759.759H69.285a.222.222,0,1,1,0,.444H52.807a1.205,1.205,0,0,1-1.2-1.2v-6.556a1.205,1.205,0,0,1,1.2-1.2H76.4a1.205,1.205,0,0,1,1.2,1.2v11.056A.222.222,0,0,1,77.382,423.416Z" transform="translate(-0.081 -350.845)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
<path id="Path_263" data-name="Path 263" d="M168.967,149.643a.222.222,0,0,1-.222-.222v-3.889a.222.222,0,1,1,.444,0v3.889A.222.222,0,0,1,168.967,149.643Z" transform="translate(-114.446 -91.518)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
<path id="Path_264" data-name="Path 264" d="M168.967,524.643a.222.222,0,0,1-.222-.222v-3.889a.222.222,0,1,1,.444,0v3.889A.222.222,0,0,1,168.967,524.643Z" transform="translate(-114.446 -457.629)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
<path id="Path_265" data-name="Path 265" d="M168.967,899.623a.222.222,0,0,1-.222-.222v-3.889a.222.222,0,1,1,.444,0V899.4A.222.222,0,0,1,168.967,899.623Z" transform="translate(-114.446 -823.72)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
<path id="Path_266" data-name="Path 266" d="M498.2,171.417a1.333,1.333,0,1,1,1.333-1.333A1.335,1.335,0,0,1,498.2,171.417Zm0-2.222a.889.889,0,1,0,.889.889A.89.89,0,0,0,498.2,169.194Z" transform="translate(-434.793 -114.402)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
<path id="Path_267" data-name="Path 267" d="M709.143,171.417a1.333,1.333,0,1,1,1.333-1.333A1.335,1.335,0,0,1,709.143,171.417Zm0-2.222a.889.889,0,1,0,.889.889A.89.89,0,0,0,709.143,169.194Z" transform="translate(-640.733 -114.402)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
<path id="Path_268" data-name="Path 268" d="M920.083,171.417a1.333,1.333,0,1,1,1.333-1.333A1.335,1.335,0,0,1,920.083,171.417Zm0-2.222a.889.889,0,1,0,.889.889A.89.89,0,0,0,920.083,169.194Z" transform="translate(-846.673 -114.402)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
<path id="Path_269" data-name="Path 269" d="M826.331,853.344h-.015a.222.222,0,0,1-.17-.1l-1.111-1.667a.222.222,0,1,1,.37-.247l.95,1.425,3.7-4.226a.222.222,0,0,1,.335.293l-3.889,4.445a.223.223,0,0,1-.167.076Z" transform="translate(-755.142 -777.995)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1,358 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 116.3 116.3" style="enable-background:new 0 0 116.3 116.3;" xml:space="preserve">
<style type="text/css">
.st0{fill:url(#SVGID_1_);}
.st1{fill:url(#SVGID_2_);}
.st2{fill:url(#SVGID_3_);}
.st3{fill:url(#SVGID_4_);}
.st4{fill:url(#SVGID_5_);}
.st5{fill:url(#SVGID_6_);}
.st6{opacity:0.4;fill:url(#SVGID_7_);enable-background:new ;}
.st7{fill:url(#SVGID_8_);}
.st8{fill:url(#SVGID_9_);}
.st9{fill:url(#SVGID_10_);}
.st10{fill:url(#SVGID_11_);}
.st11{fill:url(#SVGID_12_);}
.st12{fill:url(#SVGID_13_);}
.st13{fill:url(#SVGID_14_);}
.st14{fill:url(#SVGID_15_);}
.st15{fill:url(#SVGID_16_);}
.st16{opacity:0.2;fill:url(#SVGID_17_);enable-background:new ;}
.st17{fill:url(#SVGID_18_);}
.st18{fill:url(#SVGID_19_);}
.st19{opacity:0.25;fill:url(#SVGID_20_);enable-background:new ;}
.st20{fill:url(#SVGID_21_);}
.st21{fill:url(#SVGID_22_);}
.st22{opacity:0.2;fill:url(#SVGID_23_);enable-background:new ;}
.st23{fill:url(#SVGID_24_);}
</style>
<g>
<g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="69.0328" y1="454.9245" x2="64.4435" y2="449.5703" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2B3B6A"/>
<stop offset="1" style="stop-color:#2B3B6A"/>
</linearGradient>
<polygon class="st0" points="54.9,55.8 62,55.6 58.4,62.2 "/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="108.534" y1="457.2333" x2="108.534" y2="494.0327" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2B3B6A"/>
<stop offset="7.040000e-02" style="stop-color:#2D4576"/>
<stop offset="0.2165" style="stop-color:#2E5589"/>
<stop offset="0.3608" style="stop-color:#2B5E97"/>
<stop offset="0.5" style="stop-color:#29629C"/>
<stop offset="0.6392" style="stop-color:#2B5E97"/>
<stop offset="0.7835" style="stop-color:#2E5589"/>
<stop offset="0.9296" style="stop-color:#2D4576"/>
<stop offset="1" style="stop-color:#2B3B6A"/>
</linearGradient>
<path class="st1" d="M85.5,57.5c26.1,4.2,29.8,10.7,29.8,10.7c0,0.4,0,0.8,0,1.2c0,0.2-0.1,0.4-0.2,0.7c-0.1,0.3-2.7,5.7-19.6,9.3
L85.5,57.5z"/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="26.7686" y1="496.8278" x2="38.7091" y2="475.5678" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#252B59"/>
<stop offset="8.590000e-02" style="stop-color:#2B3A69"/>
<stop offset="0.2267" style="stop-color:#2E4A7C"/>
<stop offset="0.3658" style="stop-color:#2E5487"/>
<stop offset="0.5" style="stop-color:#2D578C"/>
<stop offset="0.6342" style="stop-color:#2E5487"/>
<stop offset="0.7733" style="stop-color:#2E4A7C"/>
<stop offset="0.9141" style="stop-color:#2B3A69"/>
<stop offset="1" style="stop-color:#252B59"/>
</linearGradient>
<path class="st2" d="M19.8,78.5c-5.9,15.7-2.9,20.6-2.7,21c0.1,0.2,0.2,0.4,0.4,0.5c0.4,0,0.8-0.1,1.2-0.2c0,0,10.7-0.5,23.2-18.3
L19.8,78.5z"/>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="60.8512" y1="424.6486" x2="41.0872" y2="401.5905" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#181844"/>
<stop offset="2.840000e-02" style="stop-color:#1E1E4C"/>
<stop offset="0.1353" style="stop-color:#283261"/>
<stop offset="0.2468" style="stop-color:#2D4172"/>
<stop offset="0.3647" style="stop-color:#2E4A7C"/>
<stop offset="0.5" style="stop-color:#2E4D7F"/>
<stop offset="0.6177" style="stop-color:#2D4576"/>
<stop offset="0.8125" style="stop-color:#273160"/>
<stop offset="1" style="stop-color:#181844"/>
</linearGradient>
<path class="st3" d="M58.8,18.6C44.5,2.9,37.5,3.8,37.1,3.9c-0.2,0-0.5,0.1-0.7,0.2c-0.5,0.2-1,1.8-1,1.8s-3,8.7,9.1,31.9
L58.8,18.6z"/>
<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="99.9721" y1="499.3526" x2="84.7036" y2="450.1664" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#181844"/>
<stop offset="2.840000e-02" style="stop-color:#1E1E4C"/>
<stop offset="0.1353" style="stop-color:#283261"/>
<stop offset="0.2468" style="stop-color:#2D4172"/>
<stop offset="0.3647" style="stop-color:#2E4A7C"/>
<stop offset="0.5" style="stop-color:#2E4D7F"/>
<stop offset="0.6177" style="stop-color:#2D4576"/>
<stop offset="0.8125" style="stop-color:#273160"/>
<stop offset="1" style="stop-color:#181844"/>
</linearGradient>
<path class="st4" d="M71.2,78.8C90.6,101,97.4,99.8,97.4,99.8c0.4,0.1,0.9,0.2,1.3,0.2c0.2-0.1,0.3-0.3,0.4-0.5
c0.3-0.4,5.8-9.4-12.8-41.8L71.2,78.8z"/>
<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="31.6447" y1="457.2331" x2="31.6447" y2="494.0317" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2B3B6A"/>
<stop offset="7.040000e-02" style="stop-color:#2D4576"/>
<stop offset="0.2165" style="stop-color:#2E5589"/>
<stop offset="0.3608" style="stop-color:#2B5E97"/>
<stop offset="0.5" style="stop-color:#29629C"/>
<stop offset="0.6392" style="stop-color:#2B5E97"/>
<stop offset="0.7835" style="stop-color:#2E5589"/>
<stop offset="0.9296" style="stop-color:#2D4576"/>
<stop offset="1" style="stop-color:#2B3B6A"/>
</linearGradient>
<path class="st5" d="M46.1,82.2c-40-1.7-44.8-11.6-45-12.1C1.1,69.9,1,69.7,1,69.5c0.1-0.7,1.5-2,1.5-2s10.6-6.5,28.3-10
L46.1,82.2z"/>
<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="51.8906" y1="421.1236" x2="66.337" y2="421.1236" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2B3B6A"/>
<stop offset="1" style="stop-color:#2B3B6A"/>
</linearGradient>
<path class="st6" d="M57.6,17.4c-5,5.4-9.6,11.2-13.8,17.2h1c3.1-3.9,10.8-13.7,13.4-16.5L57.6,17.4z"/>
<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="70.9709" y1="436.4003" x2="70.9709" y2="401.6908" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#252B59"/>
<stop offset="0.5" style="stop-color:#2D578C"/>
<stop offset="0.6934" style="stop-color:#2D5588"/>
<stop offset="0.8038" style="stop-color:#2E4F80"/>
<stop offset="0.8932" style="stop-color:#2D4474"/>
<stop offset="0.971" style="stop-color:#283463"/>
<stop offset="1" style="stop-color:#252B59"/>
</linearGradient>
<path class="st7" d="M73.8,35.4C84.2,10.7,80.2,5,80.2,5c-0.1-0.3-0.2-0.7-0.3-1c-0.2-0.1-0.4-0.1-0.7-0.2
c-0.5-0.1-11.4-1.5-34.4,30.7L73.8,35.4z"/>
<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="39.2669" y1="503.7654" x2="102.6764" y2="407.9172" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2867A2"/>
<stop offset="8.239999e-02" style="stop-color:#177EBC"/>
<stop offset="0.1675" style="stop-color:#0E91D1"/>
<stop offset="0.2527" style="stop-color:#10A2E1"/>
<stop offset="0.337" style="stop-color:#18ACEA"/>
<stop offset="0.42" style="stop-color:#24B1ED"/>
<stop offset="0.5" style="stop-color:#28B1ED"/>
<stop offset="0.58" style="stop-color:#24B1ED"/>
<stop offset="0.663" style="stop-color:#18ACEA"/>
<stop offset="0.7473" style="stop-color:#10A2E1"/>
<stop offset="0.8325" style="stop-color:#0E91D1"/>
<stop offset="0.9176" style="stop-color:#177EBC"/>
<stop offset="1" style="stop-color:#2867A2"/>
</linearGradient>
<path class="st8" d="M58,97.4c-14.2,15.4-21,14.5-21.4,14.5c-0.6-0.2-1.2-0.5-1.7-0.8l-17.3-11c7.3-1.6,16.3-10.2,25.7-21.3
L58,97.4z"/>
<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="33.568" y1="505.6873" x2="58.683" y2="483.2007" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2C5D95"/>
<stop offset="8.220001e-02" style="stop-color:#246EAB"/>
<stop offset="0.1808" style="stop-color:#1B79B9"/>
<stop offset="0.3007" style="stop-color:#1080C2"/>
<stop offset="0.5" style="stop-color:#0E81C5"/>
<stop offset="0.6993" style="stop-color:#1080C2"/>
<stop offset="0.8192" style="stop-color:#1B79B9"/>
<stop offset="0.9178" style="stop-color:#246EAB"/>
<stop offset="1" style="stop-color:#2C5D95"/>
</linearGradient>
<path class="st9" d="M58.6,98c-14.2,15.4-21,14.5-21.4,14.5c-0.6-0.2-1.2-0.5-1.7-0.8L17.6,100c7.3-1.6,16.9-9.6,26.3-20.7
L58.6,98z"/>
<linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="31.3212" y1="407.2591" x2="89.6399" y2="504.4568" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2C5D95"/>
<stop offset="1.760000e-02" style="stop-color:#2A6199"/>
<stop offset="0.1407" style="stop-color:#1C79B7"/>
<stop offset="0.2631" style="stop-color:#0A8CCA"/>
<stop offset="0.3837" style="stop-color:#0B97D4"/>
<stop offset="0.5" style="stop-color:#0E9AD8"/>
<stop offset="0.6163" style="stop-color:#0B97D4"/>
<stop offset="0.7369" style="stop-color:#0A8CCA"/>
<stop offset="0.8593" style="stop-color:#1C79B7"/>
<stop offset="0.9824" style="stop-color:#2A6199"/>
<stop offset="1" style="stop-color:#2C5D95"/>
</linearGradient>
<path class="st10" d="M20.7,38c-6.3-16.2-3.2-21.3-3-21.6c0.4-0.5,0.9-0.9,1.4-1.2l17.3-11c-1.5,7.1,2.3,18,8.2,30.7L20.7,38z"/>
<linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="94.4028" y1="503.8655" x2="56.9038" y2="456.6339" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2C5D95"/>
<stop offset="2.570000e-02" style="stop-color:#2A6199"/>
<stop offset="0.2053" style="stop-color:#1C79B7"/>
<stop offset="0.384" style="stop-color:#0A8CCA"/>
<stop offset="0.5599" style="stop-color:#0B97D4"/>
<stop offset="0.7296" style="stop-color:#0E9AD8"/>
<stop offset="0.7925" style="stop-color:#0B97D4"/>
<stop offset="0.8577" style="stop-color:#0A8CCA"/>
<stop offset="0.9239" style="stop-color:#1C79B7"/>
<stop offset="0.9905" style="stop-color:#2A6199"/>
<stop offset="1" style="stop-color:#2C5D95"/>
</linearGradient>
<path class="st11" d="M57.2,57.2c-8.7,0-17.4,0.7-26,1.9c0.3,0.5,4.3,7.2,7.2,11.7c27.8,42.8,40.8,41.1,41.4,41
c0.6-0.2,1.2-0.5,1.7-0.8l17.3-11C87,97.5,70.6,78.2,57.2,57.2z"/>
<linearGradient id="SVGID_13_" gradientUnits="userSpaceOnUse" x1="40.2175" y1="431.0724" x2="32.9164" y2="404.7886" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2C5D95"/>
<stop offset="8.220001e-02" style="stop-color:#246EAB"/>
<stop offset="0.1808" style="stop-color:#1B79B9"/>
<stop offset="0.3007" style="stop-color:#1080C2"/>
<stop offset="0.5" style="stop-color:#0E81C5"/>
<stop offset="0.6993" style="stop-color:#1080C2"/>
<stop offset="0.8192" style="stop-color:#1B79B9"/>
<stop offset="0.9178" style="stop-color:#246EAB"/>
<stop offset="1" style="stop-color:#2C5D95"/>
</linearGradient>
<path class="st12" d="M20.1,38.5c-6.3-16.2-3.2-21.3-3-21.6c0.4-0.5,0.9-0.9,1.4-1.2L36.5,4.1c-1.5,7.1,1.7,18.6,7.6,31.2
L20.1,38.5z"/>
<linearGradient id="SVGID_14_" gradientUnits="userSpaceOnUse" x1="122.9025" y1="448.7971" x2="9.1479" y2="448.7971" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2867A2"/>
<stop offset="1.280000e-02" style="stop-color:#256BA7"/>
<stop offset="0.1121" style="stop-color:#0B83C3"/>
<stop offset="0.2115" style="stop-color:#1797D8"/>
<stop offset="0.3099" style="stop-color:#25A3E2"/>
<stop offset="0.4066" style="stop-color:#27ABE7"/>
<stop offset="0.5" style="stop-color:#2AAEEA"/>
<stop offset="0.5934" style="stop-color:#27ABE7"/>
<stop offset="0.6901" style="stop-color:#25A3E2"/>
<stop offset="0.7885" style="stop-color:#1797D8"/>
<stop offset="0.8879" style="stop-color:#0B83C3"/>
<stop offset="0.9872" style="stop-color:#256BA7"/>
<stop offset="1" style="stop-color:#2867A2"/>
</linearGradient>
<path class="st13" d="M85.5,59.6c13.5,1.9,24.7,4.7,29.8,9.8V48.9c0-0.6-0.1-1.3-0.2-1.9c-0.1-0.3-2.7-5.6-19-9.1L85.5,59.6z"/>
<linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="90.2941" y1="447.1362" x2="122.8074" y2="448.8884" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2E5284"/>
<stop offset="6.100000e-03" style="stop-color:#2E5486"/>
<stop offset="9.120000e-02" style="stop-color:#29649D"/>
<stop offset="0.1876" style="stop-color:#236FAD"/>
<stop offset="0.3049" style="stop-color:#1D77B6"/>
<stop offset="0.5" style="stop-color:#1C78B9"/>
<stop offset="0.6951" style="stop-color:#1D77B6"/>
<stop offset="0.8124" style="stop-color:#236FAD"/>
<stop offset="0.9088" style="stop-color:#29649D"/>
<stop offset="0.9939" style="stop-color:#2E5486"/>
<stop offset="1" style="stop-color:#2E5284"/>
</linearGradient>
<path class="st14" d="M85.5,58.8c13.5,1.9,24.7,5.5,29.8,10.6V48.1c0-0.6-0.1-1.3-0.2-1.9c-0.1-0.3-2.7-5.6-19-9.1L85.5,58.8z"/>
<linearGradient id="SVGID_16_" gradientUnits="userSpaceOnUse" x1="9.0577" y1="447.1912" x2="67.7186" y2="447.1912" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2867A2"/>
<stop offset="2.250000e-02" style="stop-color:#256BA7"/>
<stop offset="0.1971" style="stop-color:#0B83C3"/>
<stop offset="0.3718" style="stop-color:#1797D8"/>
<stop offset="0.5447" style="stop-color:#25A3E2"/>
<stop offset="0.7147" style="stop-color:#27ABE7"/>
<stop offset="0.8788" style="stop-color:#2AAEEA"/>
<stop offset="0.9015" style="stop-color:#27ABE7"/>
<stop offset="0.9249" style="stop-color:#25A3E2"/>
<stop offset="0.9487" style="stop-color:#1797D8"/>
<stop offset="0.9728" style="stop-color:#0B83C3"/>
<stop offset="0.9969" style="stop-color:#256BA7"/>
<stop offset="1" style="stop-color:#2867A2"/>
</linearGradient>
<path class="st15" d="M73.2,35.1c-3-0.1-9.5-0.4-15.1-0.4C7.1,34.7,1.4,46.5,1.2,47C1,47.6,1,48.3,1,48.9v20.6
c5-5,15.9-7.7,29.2-9.7c8.6-1.2,17.2-1.9,25.9-2c1.6,0,3.2,0,4.8,0C60.8,57.8,76.3,35.2,73.2,35.1z"/>
<linearGradient id="SVGID_17_" gradientUnits="userSpaceOnUse" x1="50.3126" y1="432.0108" x2="28.2664" y2="428.9106" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2B3B6A"/>
<stop offset="1" style="stop-color:#2B3B6A"/>
</linearGradient>
<path class="st16" d="M44.1,33.5c-10.7,0.5-18.4,1.3-24.8,3.1l0.3,0.8c0.6-0.1,1.3-0.3,1.9-0.4c7.7-1.2,15.4-2,23.1-2.3L44.1,33.5
z"/>
<linearGradient id="SVGID_18_" gradientUnits="userSpaceOnUse" x1="72.7451" y1="450.8669" x2="10.4435" y2="442.1056" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2867A2"/>
<stop offset="3.820000e-02" style="stop-color:#2174B1"/>
<stop offset="0.1177" style="stop-color:#0B86C4"/>
<stop offset="0.2081" style="stop-color:#0A94D2"/>
<stop offset="0.3177" style="stop-color:#0C9BDB"/>
<stop offset="0.5" style="stop-color:#109EDE"/>
<stop offset="0.6823" style="stop-color:#0C9BDB"/>
<stop offset="0.7919" style="stop-color:#0A94D2"/>
<stop offset="0.8823" style="stop-color:#0B86C4"/>
<stop offset="0.9618" style="stop-color:#2174B1"/>
<stop offset="1" style="stop-color:#2867A2"/>
</linearGradient>
<path class="st17" d="M73.2,34.3c-3-0.1-9.5-0.4-15.1-0.4c-51.1,0-56.7,11.8-57,12.4C1,46.8,1,47.5,1,48.1v21.4
c5-5,15.9-8.5,29.2-10.5c8.6-1.2,17.2-1.9,25.9-2c1.6,0,3.2,0,4.8,0C63.2,57.1,76.3,34.4,73.2,34.3z"/>
<linearGradient id="SVGID_19_" gradientUnits="userSpaceOnUse" x1="101.6202" y1="407.733" x2="71.9933" y2="458.7571" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2867A2"/>
<stop offset="0.1238" style="stop-color:#177EBC"/>
<stop offset="0.2516" style="stop-color:#0E91D1"/>
<stop offset="0.3797" style="stop-color:#10A2E1"/>
<stop offset="0.5064" style="stop-color:#18ACEA"/>
<stop offset="0.631" style="stop-color:#24B1ED"/>
<stop offset="0.7513" style="stop-color:#28B1ED"/>
<stop offset="0.7911" style="stop-color:#24B1ED"/>
<stop offset="0.8324" style="stop-color:#18ACEA"/>
<stop offset="0.8743" style="stop-color:#10A2E1"/>
<stop offset="0.9167" style="stop-color:#0E91D1"/>
<stop offset="0.959" style="stop-color:#177EBC"/>
<stop offset="1" style="stop-color:#2867A2"/>
</linearGradient>
<path class="st18" d="M58.2,58.8C72.1,37.9,82.4,16,79.8,4.1l17.3,11c0.5,0.3,1,0.7,1.4,1.2c0.3,0.5,7.1,11.7-20.7,54.5
c-2,3.2-3.9,6.9-4.6,7.2c-4.1-4-12.6-15.6-14.7-18.5C58.3,59.1,58.2,58.8,58.2,58.8z"/>
<linearGradient id="SVGID_20_" gradientUnits="userSpaceOnUse" x1="105.3445" y1="433.3988" x2="94.5575" y2="453.6416" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2B3B6A"/>
<stop offset="1" style="stop-color:#2B3B6A"/>
</linearGradient>
<path class="st19" d="M96.6,37.2c-3.1,7.8-6.8,15.3-11.1,22.4l1.3,0.2c5.5-9.5,8.7-16.5,10.9-22.4L96.6,37.2z"/>
<linearGradient id="SVGID_21_" gradientUnits="userSpaceOnUse" x1="100.6479" y1="408.8533" x2="70.927" y2="464.6275" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2867A2"/>
<stop offset="3.820000e-02" style="stop-color:#2174B1"/>
<stop offset="0.1177" style="stop-color:#0B86C4"/>
<stop offset="0.2081" style="stop-color:#0A94D2"/>
<stop offset="0.3177" style="stop-color:#0C9BDB"/>
<stop offset="0.5" style="stop-color:#109EDE"/>
<stop offset="0.6823" style="stop-color:#0C9BDB"/>
<stop offset="0.7919" style="stop-color:#0A94D2"/>
<stop offset="0.8823" style="stop-color:#0B86C4"/>
<stop offset="0.9618" style="stop-color:#2174B1"/>
<stop offset="1" style="stop-color:#2867A2"/>
</linearGradient>
<path class="st20" d="M78.5,71.4c27.8-42.8,21-54,20.7-54.5c-0.4-0.5-0.9-0.9-1.4-1.2L79.8,4.1c2.5,11.8-7.4,34.6-21.2,55.5
c4.6,7.1,9.4,14,14.5,19.9C74.1,78.3,76.7,74.3,78.5,71.4z"/>
<linearGradient id="SVGID_22_" gradientUnits="userSpaceOnUse" x1="102.9539" y1="410.1097" x2="72.9714" y2="466.375" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2867A2"/>
<stop offset="3.820000e-02" style="stop-color:#2174B1"/>
<stop offset="0.1177" style="stop-color:#0B86C4"/>
<stop offset="0.2081" style="stop-color:#0A94D2"/>
<stop offset="0.3177" style="stop-color:#0C9BDB"/>
<stop offset="0.5" style="stop-color:#109EDE"/>
<stop offset="0.6823" style="stop-color:#0C9BDB"/>
<stop offset="0.7919" style="stop-color:#0A94D2"/>
<stop offset="0.8823" style="stop-color:#0B86C4"/>
<stop offset="0.9618" style="stop-color:#2174B1"/>
<stop offset="1" style="stop-color:#2867A2"/>
</linearGradient>
<path class="st21" d="M72.6,80.2c0.1-0.1,0.2-0.1,0.2-0.2c-5.3-6.2-10.2-12.8-14.7-19.7c-0.1,0.1-0.2,0.2-0.2,0.4
C57.9,60.6,67.6,75.9,72.6,80.2z"/>
<linearGradient id="SVGID_23_" gradientUnits="userSpaceOnUse" x1="54.5637" y1="474.0854" x2="62.254" y2="494.9197" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2B3B6A"/>
<stop offset="1" style="stop-color:#2B3B6A"/>
</linearGradient>
<path class="st22" d="M58.2,98.4C57.9,98.1,47.7,86.1,43.1,79l-0.8,0.9C46.9,86.6,52,93,57.6,99L58.2,98.4z"/>
<linearGradient id="SVGID_24_" gradientUnits="userSpaceOnUse" x1="69.1674" y1="452.6575" x2="78.2209" y2="509.0225" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2E5284"/>
<stop offset="2.440000e-02" style="stop-color:#2C5C92"/>
<stop offset="8.880000e-02" style="stop-color:#2075B1"/>
<stop offset="0.1599" style="stop-color:#0B86C4"/>
<stop offset="0.2403" style="stop-color:#0A94D2"/>
<stop offset="0.3378" style="stop-color:#0E9CDA"/>
<stop offset="0.5" style="stop-color:#109EDE"/>
<stop offset="0.6718" style="stop-color:#0C9BDB"/>
<stop offset="0.7751" style="stop-color:#0A94D2"/>
<stop offset="0.8603" style="stop-color:#0B86C4"/>
<stop offset="0.9351" style="stop-color:#2174B1"/>
<stop offset="1" style="stop-color:#2C5D95"/>
</linearGradient>
<path class="st23" d="M72.9,79.9c-5.3-6.2-10.2-12.8-14.7-19.7c-0.5-0.8-1.1-1.6-1.6-2.4c-8.7,0-17.4,0.7-26,1.9
c0.3,0.5,4.3,7.2,7.2,11.7c27.8,42.8,40.8,41.1,41.4,41c0.6-0.2,1.2-0.5,1.7-0.8L98.8,100C91.4,98.4,82.1,90.6,72.9,79.9z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><defs><style>.a{fill:#005699;}.b,.d{fill:none;}.b{stroke:#005699;stroke-width:1.5px;}.c{stroke:none;}</style></defs><g transform="translate(7.328 6.159)"><g transform="translate(0 0)"><path class="a" d="M-2124.191-3452.351h.007a1.335,1.335,0,0,0,.972-.341,1.106,1.106,0,0,0,.351-.847.958.958,0,0,0-.34-.76,1.407,1.407,0,0,0-.983-.337h-.012a1.365,1.365,0,0,0-.977.342,1.1,1.1,0,0,0-.053,1.549l.055.056a1.364,1.364,0,0,0,.973.341Z" transform="translate(2125.521 3454.638)"/></g><g transform="translate(0.358 0.062)"><path class="a" d="M-2123.846-3442.183h9.042a8,8,0,0,0,3.567-.767,5.651,5.651,0,0,0,2.353-2.118,6.555,6.555,0,0,0,0-6.4,5.651,5.651,0,0,0-2.351-2.114,7.975,7.975,0,0,0-3.562-.766h-3.427v8.653h2.057v-7.142h1.216a4.586,4.586,0,0,1,4.953,4.187,4.586,4.586,0,0,1-4.187,4.954,4.585,4.585,0,0,1-.772,0h-6.942v-6.035h-1.946v6.035h0Z" transform="translate(2123.846 3454.35)"/></g></g><g class="b"><path class="c" d="M5,0H25a5,5,0,0,1,5,5V24a0,0,0,0,1,0,0H5a5,5,0,0,1-5-5V5A5,5,0,0,1,5,0Z"/><path class="d" d="M5,.75H25A4.25,4.25,0,0,1,29.25,5V22.5a.75.75,0,0,1-.75.75H5A4.25,4.25,0,0,1,.75,19V5A4.25,4.25,0,0,1,5,.75Z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<g id="noun-add-929469" transform="translate(-102.6 -102.6)">
<path id="Path_270" d="M107.5,107.5c-3.9,3.9-3.9,10.2,0,14.1c3.9,3.9,10.2,3.9,14.1,0c3.9-3.9,3.9-10.2,0-14.1
C117.8,103.6,111.4,103.6,107.5,107.5C107.5,107.5,107.5,107.5,107.5,107.5z M120.5,120.5c-3.3,3.3-8.5,3.3-11.8,0
c-3.3-3.3-3.3-8.5,0-11.8c3.3-3.3,8.5-3.3,11.8,0C123.7,112,123.7,117.2,120.5,120.5z"/>
<path id="Path_271" d="M114.6,109.8c-0.4,0-0.8,0.4-0.8,0.8c0,0,0,0,0,0v3.1h-3.1c-0.5,0-0.8,0.4-0.8,0.8c0,0.5,0.4,0.8,0.8,0.8
h3.1v3.1c0,0.4,0.4,0.8,0.8,0.8c0,0,0,0,0,0c0.5,0,0.8-0.4,0.8-0.8v-3.1h3.1c0.5,0,0.8-0.4,0.8-0.8c0-0.4-0.4-0.8-0.8-0.8
c0,0,0,0,0,0h-3.1v-3.1C115.4,110.2,115.1,109.8,114.6,109.8C114.6,109.8,114.6,109.8,114.6,109.8z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 428 428" style="enable-background:new 0 0 428 428;" xml:space="preserve">
<style type="text/css">
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_1_);}
.st1{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_2_);}
.st2{fill:url(#SVGID_3_);}
.st3{fill:url(#SVGID_4_);}
</style>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-12.625" y1="262.475" x2="165.425" y2="84.425" gradientTransform="matrix(1 0 0 -1 0 428)">
<stop offset="0" style="stop-color:#7E7E7E"/>
<stop offset="1" style="stop-color:#E9FFFF"/>
</linearGradient>
<path class="st0" d="M1.6,154v21.5v1.4c0.2,0,0.4,0,0.6,0c21.8,0,39.5,17.7,39.5,39.5S24,255.9,2.2,255.9c-0.2,0-0.4,0-0.6,0V408
H101V152c0.2,0.1,0.3,0.1,0.5,0.2V51.4L1.6,154z"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="227.375" y1="343.175" x2="405.475" y2="165.075" gradientTransform="matrix(1 0 0 -1 0 428)">
<stop offset="0" style="stop-color:#999999"/>
<stop offset="0.3476" style="stop-color:#9B9B9B"/>
<stop offset="0.525" style="stop-color:#A1A3A3"/>
<stop offset="0.6639" style="stop-color:#ABB0B0"/>
<stop offset="0.7828" style="stop-color:#BAC3C3"/>
<stop offset="0.8889" style="stop-color:#CDDCDC"/>
<stop offset="0.9845" style="stop-color:#E5F9F9"/>
<stop offset="1" style="stop-color:#E9FFFF"/>
</linearGradient>
<path class="st1" d="M386.9,176.8L386.9,176.8V19h-93.7v256c-0.1-0.1-0.3-0.1-0.4-0.2v100.8l94.2-96.7v-23.2l0,0
c21.8,0,39.5-17.7,39.5-39.5C426.4,194.5,408.7,176.8,386.9,176.8z"/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="1.6" y1="341.5" x2="395.2748" y2="341.5" gradientTransform="matrix(1 0 0 -1 0 428)">
<stop offset="0" style="stop-color:#999999"/>
<stop offset="0.9889" style="stop-color:#E9FFFF"/>
</linearGradient>
<path class="st2" d="M181.3,19C126.4,19,1.6,31.5,1.6,154c0,0,49.3-42.7,136.9-25s160.9-0.7,207.6-49.1
c18.6-19.3,32.4-39.6,40.2-60.9H181.3z"/>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-723.2346" y1="1360.2583" x2="-329.5598" y2="1360.2583" gradientTransform="matrix(-1 0 0 1 -336.3346 -1016.8083)">
<stop offset="0" style="stop-color:#E9FFFF"/>
<stop offset="1" style="stop-color:#999999"/>
</linearGradient>
<path class="st3" d="M207.2,408c54.9,0,179.7-11.9,179.7-129.1c0,0-49.3,40.8-136.9,23.9s-160.9,0.7-207.6,47
C23.8,368.3,10.1,387.6,2.2,408H207.2z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 514 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

View File

@ -35,9 +35,6 @@ BaseView {
property bool successState: true
// signal to redirect the page to main view
signal loaderSourceChangeRequested(int sourceToLoad)
function slotMigrationButtonClicked() {
stackedWidget.currentIndex = AccountMigrationView.AccountMigrationStep.Synching;
AccountAdapter.setArchivePasswordAsync(CurrentAccountToMigrate.accountId, passwordInputLineEdit.text);

View File

@ -43,7 +43,6 @@ ApplicationWindow {
LayoutMirroring.childrenInherit: isRTL
enum LoadedSource {
WizardView,
MainView,
AccountMigrationView,
None
@ -66,6 +65,15 @@ ApplicationWindow {
}
}
header: Loader {
active: true
sourceComponent: GenericErrorsRow {
id: genericError
text: CurrentAccount.enabled ? JamiStrings.noNetworkConnectivity : JamiStrings.disabledAccount
height: visible? JamiTheme.chatViewHeaderPreferredHeight : 0
}
}
Rectangle {
id: focusOverlay
objectName: "focusOverlay"
@ -95,19 +103,13 @@ ApplicationWindow {
function checkLoadedSource() {
var sourceString = mainApplicationLoader.source.toString();
if (sourceString === JamiQmlUtils.wizardViewLoadPath)
return MainApplicationWindow.LoadedSource.WizardView;
else if (sourceString === JamiQmlUtils.mainViewLoadPath)
if (sourceString === JamiQmlUtils.mainViewLoadPath)
return MainApplicationWindow.LoadedSource.MainView;
return MainApplicationWindow.LoadedSource.None;
}
function startClient() {
if (UtilsAdapter.getAccountListSize() !== 0) {
setMainLoaderSource(JamiQmlUtils.mainViewLoadPath);
} else {
setMainLoaderSource(JamiQmlUtils.wizardViewLoadPath);
}
setMainLoaderSource(JamiQmlUtils.mainViewLoadPath);
}
function setMainLoaderSource(source) {
@ -129,9 +131,6 @@ ApplicationWindow {
// If we're in the onboarding wizard or 'MinimizeOnClose'
// is set, then we can quit
if (force || !UtilsAdapter.getAppValue(Settings.MinimizeOnClose) || !UtilsAdapter.getAccountListSize()) {
if (checkLoadedSource() === MainApplicationWindow.LoadedSource.MainView) {
cleanupMainView();
}
Qt.quit();
} else {
layoutManager.closeToTray();
@ -159,14 +158,6 @@ ApplicationWindow {
asynchronous: true
visible: status == Loader.Ready
Connections {
target: viewCoordinator
function onRequestAppWindowWizardView() {
setMainLoaderSource(JamiQmlUtils.wizardViewLoadPath);
}
}
Connections {
id: connectionMigrationEnded
@ -182,32 +173,16 @@ ApplicationWindow {
}
}
Connections {
target: mainApplicationLoader.item
function onLoaderSourceChangeRequested(sourceToLoad) {
if (sourceToLoad === MainApplicationWindow.LoadedSource.WizardView)
setMainLoaderSource(JamiQmlUtils.wizardViewLoadPath);
else if (sourceToLoad === MainApplicationWindow.LoadedSource.AccountMigrationView)
setMainLoaderSource(JamiQmlUtils.accountMigrationViewLoadPath);
else
setMainLoaderSource(JamiQmlUtils.mainViewLoadPath);
}
}
// Set `visible = false` when loading a new QML file.
onSourceChanged: windowSettingsLoaded = false
onLoaded: {
if (checkLoadedSource() === MainApplicationWindow.LoadedSource.WizardView) {
// Onboarding wizard window, these settings are fixed.
// - window screen will default to the primary
// - the window will showNormal once windowSettingsLoaded is
// set to true(then forcing visible to true)
appWindow.width = JamiTheme.wizardViewMinWidth;
appWindow.height = JamiTheme.wizardViewMinHeight;
appWindow.minimumWidth = JamiTheme.wizardViewMinWidth;
appWindow.minimumHeight = JamiTheme.wizardViewMinHeight;
if (UtilsAdapter.getAccountListSize() === 0) {
layoutManager.restoreWindowSettings();
if (!viewCoordinator.rootView)
// Set the viewCoordinator's root item.
viewCoordinator.init(item);
viewCoordinator.present("WizardView");
} else {
// Main window, load any valid app settings, and allow the
// layoutManager to handle as much as possible.
@ -220,8 +195,9 @@ ApplicationWindow {
viewCoordinator.present("WelcomePage");
viewCoordinator.preload("ConversationView");
});
// Set the viewCoordinator's root item.
viewCoordinator.init(item);
if (!viewCoordinator.rootView)
// Set the viewCoordinator's root item.
viewCoordinator.init(item);
if (CurrentAccountToMigrate.accountToMigrateListSize > 0)
viewCoordinator.present("AccountMigrationView");
}
@ -235,8 +211,8 @@ ApplicationWindow {
// Quiet check for updates on start if set to.
if (Qt.platform.os.toString() === "windows") {
if (UtilsAdapter.getAppValue(Settings.AutoUpdate)) {
UpdateManager.checkForUpdates(true);
UpdateManager.setAutoUpdateCheck(true);
AppVersionManager.checkForUpdates(true);
AppVersionManager.setAutoUpdateCheck(true);
}
}
@ -263,6 +239,10 @@ ApplicationWindow {
Connections {
target: MainApplication
function onAboutToQuit() {
cleanupMainView()
}
function onCloseRequested() {
close(true);
}
@ -298,9 +278,9 @@ ApplicationWindow {
}
Connections {
target: UpdateManager
target: AppVersionManager
function onUpdateDownloadStarted() {
function onDownloadStarted() {
viewCoordinator.presentDialog(appWindow, "settingsview/components/UpdateDownloadDialog.qml", {
"title": JamiStrings.updateDialogTitle
});
@ -320,7 +300,7 @@ ApplicationWindow {
"buttonTitles": [JamiStrings.optionUpgrade, JamiStrings.optionLater],
"buttonStyles": [SimpleMessageDialog.ButtonStyle.TintedBlue, SimpleMessageDialog.ButtonStyle.TintedBlue],
"buttonCallBacks": [function () {
UpdateManager.applyUpdates();
AppVersionManager.applyUpdates();
}]
});
}

View File

@ -27,7 +27,10 @@ QtObject {
required property QtObject viewManager
signal initialized
signal requestAppWindowWizardView
function requestAppWindowWizardView() {
viewCoordinator.present("WizardView");
}
// A map of view names to file paths for QML files that define each view.
property variant resources: {

View File

@ -34,10 +34,12 @@ AccountAdapter::AccountAdapter(AppSettingsManager* settingsManager,
, settingsManager_(settingsManager)
, systemTray_(systemTray)
, accountListModel_(new AccountListModel(instance))
, deviceItemListModel_(new DeviceItemListModel(instance))
, deviceItemListModel_(new DeviceItemListModel(instance, parent))
, moderatorListModel_(new ModeratorListModel(instance, parent))
{
QML_REGISTERSINGLETONTYPE_POBJECT(NS_MODELS, accountListModel_.get(), "AccountListModel");
QML_REGISTERSINGLETONTYPE_POBJECT(NS_MODELS, deviceItemListModel_.get(), "DeviceItemListModel");
QML_REGISTERSINGLETONTYPE_POBJECT(NS_MODELS, moderatorListModel_.get(), "ModeratorListModel");
connect(&lrcInstance_->accountModel(),
&AccountModel::accountStatusChanged,

View File

@ -22,6 +22,7 @@
#include "accountlistmodel.h"
#include "deviceitemlistmodel.h"
#include "moderatorlistmodel.h"
#include "systemtray.h"
#include "lrcinstance.h"
#include "utils.h"
@ -102,5 +103,6 @@ private:
QScopedPointer<AccountListModel> accountListModel_;
QScopedPointer<DeviceItemListModel> deviceItemListModel_;
QScopedPointer<ModeratorListModel> moderatorListModel_;
};
Q_DECLARE_METATYPE(AccountAdapter*)

View File

@ -46,9 +46,10 @@ extern const QString defaultDownloadPath;
X(AppTheme, "System") \
X(BaseZoom, 1.0) \
X(ParticipantsSide, false) \
X(HideSelf, false) \
X(HideSelf, true) \
X(HideSpectators, false) \
X(AutoUpdate, true) \
X(PluginAutoUpdate, false) \
X(StartMinimized, false) \
X(ShowChatviewHorizontally, true) \
X(NeverShowMeAgain, false) \
@ -60,6 +61,7 @@ extern const QString defaultDownloadPath;
X(PositionShareLimit, true) \
X(FlipSelf, true) \
X(ShowMardownOption, false) \
X(ChatViewEnterIsNewLine, false) \
X(ShowSendOption, false)
/*

View File

@ -15,7 +15,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "updatemanager.h"
#include "appversionmanager.h"
#include "lrcinstance.h"
#include "version.h"
@ -37,9 +37,9 @@ static constexpr char betaVersionSubUrl[] = "/beta/version";
static constexpr char msiSubUrl[] = "/jami.release.x64.msi";
static constexpr char betaMsiSubUrl[] = "/beta/jami.beta.x64.msi";
struct UpdateManager::Impl : public QObject
struct AppVersionManager::Impl : public QObject
{
Impl(const QString& url, LRCInstance* instance, UpdateManager& parent)
Impl(const QString& url, LRCInstance* instance, AppVersionManager& parent)
: QObject(nullptr)
, parent_(parent)
, lrcInstance_(instance)
@ -60,9 +60,9 @@ struct UpdateManager::Impl : public QObject
// Fail without UI if this is a programmatic check.
if (!quiet)
connect(&parent_,
&NetworkManager::errorOccured,
&NetworkManager::errorOccurred,
&parent_,
&UpdateManager::updateErrorOccurred);
&AppVersionManager::updateErrorOccurred);
cleanUpdateFiles();
QUrl versionUrl {isBeta ? QUrl::fromUserInput(baseUrlString_ + betaVersionSubUrl)
@ -92,31 +92,21 @@ struct UpdateManager::Impl : public QObject
{
parent_.disconnect();
connect(&parent_,
&NetworkManager::errorOccured,
&NetworkManager::errorOccurred,
&parent_,
&UpdateManager::updateErrorOccurred);
connect(&parent_, &UpdateManager::statusChanged, this, [this](Status status) {
switch (status) {
case Status::STARTED:
Q_EMIT parent_.updateDownloadStarted();
break;
case Status::FINISHED:
Q_EMIT parent_.updateDownloadFinished();
break;
default:
break;
}
});
&AppVersionManager::updateErrorOccurred);
QUrl downloadUrl {(beta || isBeta) ? QUrl::fromUserInput(baseUrlString_ + betaMsiSubUrl)
: QUrl::fromUserInput(baseUrlString_ + msiSubUrl)};
const QUrl downloadUrl {(beta || isBeta)
? QUrl::fromUserInput(baseUrlString_ + betaMsiSubUrl)
: QUrl::fromUserInput(baseUrlString_ + msiSubUrl)};
parent_.downloadFile(
int uuid = parent_.downloadFile(
downloadUrl,
*(parent_.replyId_),
[this, downloadUrl](bool success, const QString& errorMessage) {
Q_UNUSED(success)
Q_UNUSED(errorMessage)
QProcess process;
const QProcess process;
auto basePath = tempPath_ + QDir::separator();
auto msiPath = QDir::toNativeSeparators(basePath + downloadUrl.fileName());
auto logPath = QDir::toNativeSeparators(basePath + "jami_x64_install.log");
@ -127,11 +117,12 @@ struct UpdateManager::Impl : public QObject
<< "/L*V" << logPath);
},
tempPath_);
parent_.replyId_.reset(&uuid);
};
void cancelUpdate()
{
parent_.cancelDownload();
parent_.cancelDownload(*(parent_.replyId_));
};
void setAutoUpdateCheck(bool state)
@ -162,7 +153,7 @@ struct UpdateManager::Impl : public QObject
}
};
UpdateManager& parent_;
AppVersionManager& parent_;
LRCInstance* lrcInstance_ {nullptr};
QString baseUrlString_;
@ -170,51 +161,52 @@ struct UpdateManager::Impl : public QObject
QTimer* updateTimer_;
};
UpdateManager::UpdateManager(const QString& url,
ConnectivityMonitor* cm,
LRCInstance* instance,
QObject* parent)
AppVersionManager::AppVersionManager(const QString& url,
ConnectivityMonitor* cm,
LRCInstance* instance,
QObject* parent)
: NetworkManager(cm, parent)
, replyId_(new int(0))
, pimpl_(std::make_unique<Impl>(url, instance, *this))
{}
UpdateManager::~UpdateManager()
AppVersionManager::~AppVersionManager()
{
cancelDownload();
cancelDownload(*replyId_);
}
void
UpdateManager::checkForUpdates(bool quiet)
AppVersionManager::checkForUpdates(bool quiet)
{
pimpl_->checkForUpdates(quiet);
}
void
UpdateManager::applyUpdates(bool beta)
AppVersionManager::applyUpdates(bool beta)
{
pimpl_->applyUpdates(beta);
}
void
UpdateManager::cancelUpdate()
AppVersionManager::cancelUpdate()
{
pimpl_->cancelUpdate();
}
void
UpdateManager::setAutoUpdateCheck(bool state)
AppVersionManager::setAutoUpdateCheck(bool state)
{
pimpl_->setAutoUpdateCheck(state);
}
bool
UpdateManager::isCurrentVersionBeta()
AppVersionManager::isCurrentVersionBeta()
{
return isBeta;
}
bool
UpdateManager::isUpdaterEnabled()
AppVersionManager::isUpdaterEnabled()
{
#ifdef Q_OS_WIN
return true;
@ -223,116 +215,7 @@ UpdateManager::isUpdaterEnabled()
}
bool
UpdateManager::isAutoUpdaterEnabled()
AppVersionManager::isAutoUpdaterEnabled()
{
return false;
}
void
UpdateManager::cancelDownload()
{
if (downloadReply_) {
Q_EMIT errorOccured(GetError::CANCELED);
downloadReply_->abort();
resetDownload();
}
}
void
UpdateManager::downloadFile(const QUrl& url,
std::function<void(bool, const QString&)> onDoneCallback,
const QString& filePath)
{
// If there is already a download in progress, return.
if (downloadReply_ && downloadReply_->isRunning()) {
qWarning() << Q_FUNC_INFO << "Download already in progress";
return;
}
// Clean up any previous download.
resetDownload();
// If the url is invalid, return.
if (!url.isValid()) {
Q_EMIT errorOccured(GetError::NETWORK_ERROR, "Invalid url");
return;
}
// If the file path is empty, return.
if (filePath.isEmpty()) {
Q_EMIT errorOccured(GetError::NETWORK_ERROR, "Invalid file path");
return;
}
// Create the file. Return if it cannot be created.
QFileInfo fileInfo(url.path());
QString fileName = fileInfo.fileName();
file_.reset(new QFile(filePath + "/" + fileName));
if (!file_->open(QIODevice::WriteOnly)) {
Q_EMIT errorOccured(GetError::ACCESS_DENIED);
file_.reset();
qWarning() << Q_FUNC_INFO << "Could not open file for writing";
return;
}
// Start the download.
QNetworkRequest request(url);
downloadReply_ = manager_->get(request);
connect(downloadReply_, &QNetworkReply::readyRead, this, [=]() {
if (file_ && file_->isOpen()) {
file_->write(downloadReply_->readAll());
}
});
connect(downloadReply_,
&QNetworkReply::downloadProgress,
this,
[=](qint64 bytesReceived, qint64 bytesTotal) {
Q_EMIT downloadProgressChanged(bytesReceived, bytesTotal);
});
connect(downloadReply_,
QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::errorOccurred),
this,
[this](QNetworkReply::NetworkError error) {
downloadReply_->disconnect();
resetDownload();
qWarning() << Q_FUNC_INFO
<< QMetaEnum::fromType<QNetworkReply::NetworkError>().valueToKey(error);
Q_EMIT errorOccured(GetError::NETWORK_ERROR);
});
connect(downloadReply_, &QNetworkReply::finished, this, [this, onDoneCallback]() {
bool success = false;
QString errorMessage;
if (downloadReply_->error() == QNetworkReply::NoError) {
resetDownload();
success = true;
} else {
errorMessage = downloadReply_->errorString();
resetDownload();
}
onDoneCallback(success, errorMessage);
Q_EMIT statusChanged(Status::FINISHED);
});
Q_EMIT statusChanged(Status::STARTED);
}
void
UpdateManager::resetDownload()
{
if (downloadReply_) {
downloadReply_->deleteLater();
downloadReply_ = nullptr;
}
if (file_) {
if (file_->isOpen()) {
file_->flush();
file_->close();
}
file_->deleteLater();
file_.reset();
}
}

View File

@ -1,6 +1,5 @@
/*
* Copyright (C) 2020-2023 Savoir-faire Linux Inc.
* Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -25,51 +24,35 @@
class LRCInstance;
class ConnectivityMonitor;
class UpdateManager final : public NetworkManager
class AppVersionManager final : public NetworkManager
{
Q_OBJECT
Q_DISABLE_COPY(UpdateManager)
Q_DISABLE_COPY(AppVersionManager)
public:
explicit UpdateManager(const QString& url,
ConnectivityMonitor* cm,
LRCInstance* instance = nullptr,
QObject* parent = nullptr);
~UpdateManager();
enum Status { STARTED, FINISHED };
Q_ENUM(Status)
explicit AppVersionManager(const QString& url,
ConnectivityMonitor* cm,
LRCInstance* instance = nullptr,
QObject* parent = nullptr);
~AppVersionManager();
Q_INVOKABLE void checkForUpdates(bool quiet = false);
Q_INVOKABLE void applyUpdates(bool beta = false);
Q_INVOKABLE void cancelUpdate();
Q_INVOKABLE void setAutoUpdateCheck(bool state);
Q_INVOKABLE bool isCurrentVersionBeta();
Q_INVOKABLE bool isUpdaterEnabled();
Q_INVOKABLE bool isAutoUpdaterEnabled();
Q_INVOKABLE void cancelDownload();
void downloadFile(const QUrl& url,
std::function<void(bool, const QString&)> onDoneCallback,
const QString& filePath);
Q_INVOKABLE void setAutoUpdateCheck(bool state);
Q_INVOKABLE void cancelUpdate();
Q_INVOKABLE bool isCurrentVersionBeta();
Q_SIGNALS:
void statusChanged(UpdateManager::Status status);
void downloadProgressChanged(qint64 bytesRead, qint64 totalBytes);
void updateCheckReplyReceived(bool ok, bool found = false);
void updateErrorOccurred(const NetworkManager::GetError& error);
void updateDownloadStarted();
void updateDownloadProgressChanged(qint64 bytesRead, qint64 totalBytes);
void updateDownloadFinished();
void appCloseRequested();
void updateCheckReplyReceived(bool ok, bool found = false);
void updateDownloadProgressChanged(qint64 bytesRead, qint64 totalBytes);
void updateErrorOccurred(const NetworkManager::GetError& error);
private:
void resetDownload();
QNetworkReply* downloadReply_ {nullptr};
QScopedPointer<QFile> file_;
private:
QScopedPointer<int> replyId_;
struct Impl;
friend struct Impl;
std::unique_ptr<Impl> pimpl_;
};
Q_DECLARE_METATYPE(UpdateManager*)
Q_DECLARE_METATYPE(AppVersionManager*)

View File

@ -53,21 +53,21 @@ public:
return {};
}
auto imageId = idInfo.at(1);
const auto& imageId = idInfo.at(1);
if (!imageId.size()) {
qWarning() << Q_FUNC_INFO << "Missing id in the image url";
return {};
}
auto type = idInfo.at(0);
const auto& type = idInfo.at(0);
if (type == "conversation") {
if (imageId == "temp")
return Utils::tempConversationAvatar(requestedSize);
return Utils::conversationAvatar(lrcInstance_, imageId, requestedSize);
} else if (type == "account")
}
if (type == "account")
return Utils::accountPhoto(lrcInstance_, imageId, requestedSize);
else if (type == "contact")
if (type == "contact")
return Utils::contactPhoto(lrcInstance_, imageId, requestedSize);
qWarning() << Q_FUNC_INFO << "Missing valid prefix in the image url";

View File

@ -77,6 +77,7 @@ void
AvatarRegistry::onProfileUpdated(const QString& uri)
{
auto& convInfo = lrcInstance_->getConversationFromPeerUri(uri);
addOrUpdateImage(uri);
if (convInfo.uid.isEmpty())
return;

View File

@ -38,7 +38,7 @@ Item {
property string imageId
readonly property string divider: '_'
readonly property string baseProviderPrefix: 'image://avatarImage'
readonly property string baseProviderPrefix: 'image://avatarimage'
property string typePrefix: {
switch (mode) {
case Avatar.Mode.Account:

View File

@ -20,6 +20,7 @@ import QtQuick.Controls
import QtQuick.Layouts
import Qt5Compat.GraphicalEffects
import net.jami.Constants 1.1
import "../mainview/components"
Popup {
id: root
@ -28,64 +29,80 @@ Popup {
property bool autoClose: true
property alias backgroundColor: container.color
property alias title: titleText.text
property var popupContentLoader: containerSubContentLoader
property var popupcontainerSubContentLoader: containerSubContentLoader
property bool topLayoutVisible: true
property alias popupContentLoadStatus: containerSubContentLoader.status
property alias popupContent: containerSubContentLoader.sourceComponent
property int popupContentPreferredHeight: 0
property int popupContentPreferredWidth: 0
property int popupContentMargins: 0
property int popupContentMargins: JamiTheme.preferredMarginSize
parent: Overlay.overlay
// center in parent
x: Math.round((parent.width - width) / 2)
y: Math.round((parent.height - height) / 2)
anchors.centerIn: parent
modal: true
padding: popupContentMargins
padding: 0
// A popup is invisible until opened.
visible: false
focus: true
closePolicy: autoClose ? (Popup.CloseOnEscape | Popup.CloseOnPressOutside) : Popup.NoAutoClose
Rectangle {
contentItem: Control {
id: container
anchors.fill: parent
property color color: JamiTheme.secondaryBackgroundColor
padding: popupContentMargins
anchors.margins: popupContentMargins
anchors.centerIn: parent
ColumnLayout {
anchors.fill: parent
background: Rectangle {
id: bgRect
radius: JamiTheme.modalPopupRadius
color: container.color
layer.enabled: true
layer.effect: DropShadow {
horizontalOffset: 3.0
verticalOffset: 3.0
radius: bgRect.radius * 4
color: JamiTheme.shadowColor
source: bgRect
transparentBorder: true
samples: radius + 1
}
}
spacing: 0
contentItem: ColumnLayout {
id: contentLayout
Text {
id: titleText
RowLayout {
Layout.preferredWidth: parent.width
Layout.bottomMargin: JamiTheme.preferredMarginSize
visible: topLayoutVisible
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
Layout.margins: text.length === 0 ? 0 : 10
Label {
id: titleText
Layout.preferredHeight: text.length === 0 ? 0 : contentHeight
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
font.pointSize: JamiTheme.menuFontSize
color: JamiTheme.textColor
font.pointSize: 12
color: JamiTheme.textColor
visible: text.length > 0
}
JamiPushButton {
id: closeButton
Layout.alignment: Qt.AlignRight
imageColor: "grey"
normalColor: "transparent"
source: JamiResources.round_close_24dp_svg
onClicked: close()
}
}
Loader {
id: containerSubContentLoader
Layout.topMargin: popupContentMargins
Layout.bottomMargin: popupContentMargins
Layout.alignment: Qt.AlignCenter
Layout.fillWidth: popupContentPreferredWidth === 0
Layout.fillHeight: popupContentPreferredHeight === 0
Layout.preferredHeight: popupContentPreferredHeight
Layout.preferredWidth: popupContentPreferredWidth
}
}
radius: JamiTheme.modalPopupRadius
color: JamiTheme.secondaryBackgroundColor
}
background: Rectangle {
@ -102,19 +119,6 @@ Popup {
}
}
DropShadow {
z: -1
width: root.width
height: root.height
horizontalOffset: 3.0
verticalOffset: 3.0
radius: container.radius * 4
color: JamiTheme.shadowColor
source: container
transparentBorder: true
samples: radius + 1
}
enter: Transition {
NumberAnimation {
properties: "opacity"

View File

@ -28,7 +28,7 @@ SBSMessageBase {
component JoinCallButton: PushButton {
visible: root.isActive
toolTipText: JamiStrings.joinCall
preferredSize: 40
preferredSize: visible ? 40 : 0
imageColor: callLabel.color
normalColor: "transparent"
hoveredColor: Qt.rgba(255, 255, 255, 0.2)
@ -84,7 +84,7 @@ SBSMessageBase {
}
horizontalAlignment: Qt.AlignHCenter
font.pixelSize: JamiTheme.emojiBubbleSize
font.pointSize: JamiTheme.mediumFontSize
font.hintingPreference: Font.PreferNoHinting
font.bold: true
renderType: Text.NativeRendering

View File

@ -27,9 +27,6 @@ BaseModalDialog {
signal accepted
width: Math.min(appWindow.width - 2 * JamiTheme.preferredMarginSize, JamiTheme.preferredDialogWidth)
height: Math.min(appWindow.height - 2 * JamiTheme.preferredMarginSize, JamiTheme.preferredDialogHeight)
property string confirmLabel: ""
property string textLabel: ""
@ -40,7 +37,7 @@ BaseModalDialog {
id: labelAction
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: column.width - JamiTheme.preferredMarginSize * 2
Layout.maximumWidth: root.width - JamiTheme.preferredMarginSize * 4
color: JamiTheme.textColor
text: root.textLabel
@ -55,8 +52,8 @@ BaseModalDialog {
RowLayout {
spacing: 16
Layout.fillWidth: true
Layout.alignment: Qt.AlignCenter
Layout.topMargin: JamiTheme.preferredMarginSize
MaterialButton {
id: primaryBtn

View File

@ -30,17 +30,16 @@ Column {
property int timestamp: Timestamp
property string formattedTime: MessagesAdapter.getFormattedTime(Timestamp)
property string formattedDay: MessagesAdapter.getFormattedDay(Timestamp)
property int seq: MsgSeq.single//a changer par textlabel
property int seq: MsgSeq.single
property alias messageToSend: textLabel.text
width: ListView.view ? ListView.view.width : 0
spacing: 2
topPadding: 12
bottomPadding: 12
height: timestampItem.height + textLabel.height
spacing: 0
ColumnLayout {
Item {
anchors.horizontalCenter: parent.horizontalCenter
width: parent.width
height: timestampItem.height + textLabel.height
TimestampInfo {
id: timestampItem
@ -49,46 +48,23 @@ Column {
showTime: root.showTime
formattedTime: root.formattedTime
formattedDay: root.formattedDay
Layout.alignment: Qt.AlignHCenter
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top
}
Rectangle {
id: msg
Label {
id: textLabel
width: childrenRect.width
height: JamiTheme.contactMessageAvatarSize + 12
radius: JamiTheme.contactMessageAvatarSize / 2 + 6
Layout.alignment: Qt.AlignCenter
color: "transparent"
border.width: 1
border.color: CurrentConversation.isCoreDialog ? JamiTheme.messageInBgColor : CurrentConversation.color
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: timestampItem.bottom
RowLayout {
anchors.verticalCenter: parent.verticalCenter
Avatar {
Layout.leftMargin: 6
width: JamiTheme.contactMessageAvatarSize
height: JamiTheme.contactMessageAvatarSize
visible: ActionUri !== ""
imageId: ActionUri !== CurrentAccount.uri ? ActionUri : CurrentAccount.id
showPresenceIndicator: false
mode: ActionUri !== CurrentAccount.uri ? Avatar.Mode.Contact : Avatar.Mode.Account
}
Label {
id: textLabel
Layout.rightMargin: 6
width: parent.width
text: Body
horizontalAlignment: Qt.AlignHCenter
font.pointSize: JamiTheme.contactEventPointSize
font.bold: true
color: JamiTheme.chatviewTextColor
textFormat: TextEdit.PlainText
}
}
text: Body
horizontalAlignment: Qt.AlignHCenter
font.pointSize: JamiTheme.smallFontSize
color: JamiTheme.chatviewSecondaryInformationColor
textFormat: TextEdit.PlainText
}
}
opacity: 0

View File

@ -68,7 +68,8 @@ BaseModalDialog {
id: daemonReconnectPopupTextLabel
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
Layout.topMargin: preferredMargin
Layout.maximumWidth: root.parent.width - 4 * JamiTheme.preferredMarginSize
wrapMode: Text.Wrap
text: connectionFailed ? JamiStrings.reconnectionFailed : JamiStrings.reconnectDaemon
font.pointSize: JamiTheme.textFontSize + 2

View File

@ -88,8 +88,11 @@ Loader {
target: parent
enabled: canOpen
onHoveredChanged: {
dataTransferItem.hoveredLink = enabled && hovered ?
("file:///" + Body) : ""
if (enabled && hovered) {
dataTransferItem.hoveredLink = UtilsAdapter.urlFromLocalPath(Body)
} else {
dataTransferItem.hoveredLink = ""
}
}
cursorShape: enabled ?
Qt.PointingHandCursor :
@ -199,10 +202,12 @@ Loader {
Qt.PointingHandCursor :
Qt.ArrowCursor
onClicked: function (mouse) {
dataTransferItem.hoveredLink = canOpen ?
("file:///" + Body) : ""
if (dataTransferItem.hoveredLink)
if (canOpen) {
dataTransferItem.hoveredLink = UtilsAdapter.urlFromLocalPath(Body)
Qt.openUrlExternally(new Url(dataTransferItem.hoveredLink))
} else {
dataTransferItem.hoveredLink = ""
}
}
}
}
@ -303,7 +308,7 @@ Loader {
antialiasing: true
autoTransform: true
asynchronous: true
source: "file:///" + Body
source: UtilsAdapter.urlFromLocalPath(Body)
property real aspectRatio: implicitWidth / implicitHeight
property real adjustedWidth: Math.min(maxSize,
Math.max(minSize,
@ -348,7 +353,7 @@ Loader {
antialiasing: true
autoTransform: true
asynchronous: true
source: Body !== undefined ? "file:///" + Body : ''
source: Body !== undefined ? UtilsAdapter.urlFromLocalPath(Body) : ''
// The sourceSize represents the maximum source dimensions.
// This should not be a dynamic binding, as property changes

View File

@ -33,17 +33,15 @@ BaseModalDialog {
title: JamiStrings.deleteAccount
width: Math.min(appWindow.width - 2 * JamiTheme.preferredMarginSize, JamiTheme.preferredDialogWidth)
height: Math.min(appWindow.height - 2 * JamiTheme.preferredMarginSize, JamiTheme.preferredDialogHeight)
popupContent: ColumnLayout {
id: deleteAccountContentColumnLayout
anchors.centerIn: parent
Label {
id: labelDeletion
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: deleteAccountContentColumnLayout.width - JamiTheme.preferredMarginSize * 2
Layout.maximumWidth: root.width - 4*JamiTheme.preferredMarginSize
color: JamiTheme.textColor
text: JamiStrings.confirmDeleteQuestion
@ -51,8 +49,6 @@ BaseModalDialog {
font.pointSize: JamiTheme.textFontSize
font.kerning: true
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
wrapMode: Text.Wrap
}
@ -60,7 +56,6 @@ BaseModalDialog {
id: labelBestId
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: deleteAccountContentColumnLayout.width - JamiTheme.preferredMarginSize * 2
color: JamiTheme.textColor
text: bestName
@ -68,9 +63,6 @@ BaseModalDialog {
font.pointSize: JamiTheme.textFontSize
font.kerning: true
font.bold: true
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
wrapMode: Text.Wrap
}
@ -78,7 +70,7 @@ BaseModalDialog {
id: labelAccountHash
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: deleteAccountContentColumnLayout.width - JamiTheme.preferredMarginSize * 2
Layout.preferredWidth: root.width - 4*JamiTheme.preferredMarginSize
color: JamiTheme.textColor
text: accountId
@ -87,7 +79,6 @@ BaseModalDialog {
font.kerning: true
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
wrapMode: Text.Wrap
}
@ -97,7 +88,7 @@ BaseModalDialog {
visible: !isSIP
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: deleteAccountContentColumnLayout.width - JamiTheme.preferredMarginSize * 2
Layout.preferredWidth: root.width - 4*JamiTheme.preferredMarginSize
text: JamiStrings.deleteAccountInfos
@ -120,6 +111,7 @@ BaseModalDialog {
id: btnDelete
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: JamiTheme.preferredMarginSize
preferredWidth: JamiTheme.preferredFieldWidth / 2 - 8
buttontextHeightMargin: JamiTheme.buttontextHeightMargin
@ -164,6 +156,7 @@ BaseModalDialog {
id: btnCancel
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: JamiTheme.preferredMarginSize
preferredWidth: JamiTheme.preferredFieldWidth / 2 - 8
buttontextHeightMargin: JamiTheme.buttontextHeightMargin

View File

@ -85,10 +85,12 @@ BaseView {
clip: true
required property bool isMinorPane
onWidthChanged: {
if (!isSinglePane && ((isRTL && !isMinorPane) || (!isRTL && isMinorPane)))
if (!isSinglePane && isMinorPane)
previousMinorPaneWidth = width
if (!isSinglePane && ((isRTL && isMinorPane) || (!isRTL && !isMinorPane)))
if (!isSinglePane && !isMinorPane)
previousMajorPaneWidth = width
if (isMinorPane)
JamiTheme.currentLeftPaneWidth = width
}
Connections {
@ -101,8 +103,9 @@ BaseView {
}
}
SplitView.minimumWidth: isSinglePane ? viewNode.width : (isMinorPane && !isRTL ? minorPaneMinWidth : majorPaneMinWidth)
SplitView.maximumWidth: isSinglePane ? viewNode.width : viewNode.width - (isMinorPane && !isRTL ? majorPaneMinWidth : minorPaneMinWidth)
SplitView.preferredWidth: isMinorPane && !isRTL ? minorPaneMinWidth : majorPaneMinWidth
SplitView.minimumWidth: isSinglePane ? undefined : (isMinorPane ? minorPaneMinWidth : majorPaneMinWidth)
SplitView.maximumWidth: isSinglePane || !isMinorPane ? undefined : Math.abs(viewNode.width - majorPaneMinWidth)
SplitView.preferredWidth: isSinglePane || !isMinorPane ? undefined : JamiTheme.currentLeftPaneWidth
SplitView.fillWidth: !isMinorPane || isSinglePane
}
}

View File

@ -25,19 +25,13 @@ import net.jami.Constants 1.1
BaseModalDialog {
id: root
width: 488
height: 256
width: JamiTheme.secondaryDialogDimension
property var previousBodies: undefined
popupContent: Item {
id: rect
width: root.width
JamiListView {
anchors.fill: parent
anchors.margins: JamiTheme.preferredMarginSize
popupContent: JamiListView {
width: root.width - 4 * JamiTheme.preferredMarginSize
height: Math.min(count * 50, 150)
model: root.previousBodies
@ -79,17 +73,4 @@ BaseModalDialog {
}
}
}
PushButton {
id: btnCancel
imageColor: "grey"
normalColor: "transparent"
anchors.right: parent.right
anchors.top: parent.top
anchors.topMargin: 10
anchors.rightMargin: 10
source: JamiResources.round_close_24dp_svg
onClicked: close()
}
}
}

View File

@ -42,6 +42,7 @@ Popup {
padding: 0
visible: false
focus: true
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
Rectangle {

View File

@ -24,9 +24,13 @@ import net.jami.Constants 1.1
Item {
id: root
width: reactionBubble.width
property var reactions
property real contentHeight: bubble.height
property real contentWidth: bubble.width
property real contentHeight: reactionBubble.height
property real contentWidth: reactionBubble.width
property color borderColor: undefined
property int maxWidth: JamiTheme.defaulMaxWidthReaction
visible: emojis.length && Body !== ""
@ -80,36 +84,30 @@ Item {
return [];
}
// TODO:
// -order emojis based on the timestamp of the reaction and/or the quantity of emojis
Rectangle {
id: bubble
id: reactionBubble
color: JamiTheme.emojiReactBubbleBgColor
width: textEmojis.width + 6
height: textEmojis.height + 6
radius: 10
Text {
id: textEmojis
anchors.margins: 10
anchors.centerIn: bubble
font.pointSize: JamiTheme.emojiReactSize
color: JamiTheme.chatviewTextColor
text: root.emojis
}
width: textEmojis.width + 10
height: textEmojis.height + 10
anchors.centerIn: textEmojis
radius: 5
border.color: root.borderColor
border.width: 1
}
DropShadow {
z: -1
Text {
id: textEmojis
anchors.margins: 10
anchors.centerIn: root
width: bubble.width
height: bubble.height
horizontalOffset: 3.0
verticalOffset: 3.0
radius: bubble.radius * 4
color: JamiTheme.shadowColor
source: bubble
transparentBorder: true
samples: radius + 1
font.pointSize: JamiTheme.emojiReactSize
color: JamiTheme.chatviewTextColor
text: root.emojis
width: Math.min(implicitWidth,root.maxWidth)
wrapMode: Text.Wrap
}
}

View File

@ -40,6 +40,7 @@ Column {
ColumnLayout {
width: parent.width
spacing: 0
TimestampInfo {
id: timestampItem

View File

@ -0,0 +1,75 @@
/*
* Copyright (C) 2022-2023 Savoir-faire Linux Inc.
* Author: Xavier Jouslin <xavier.jouslindenoray@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Qt.labs.platform
import net.jami.Models 1.1
import net.jami.Adapters 1.1
import net.jami.Constants 1.1
RowLayout {
id: root
property string labelText: ""
property int widthOfSwitch: 50
property int heightOfSwitch: 10
property string tooltipText: ""
property alias toggleSwitch: autoupdate
property alias checked: autoupdate.checked
signal switchToggled
Layout.alignment: Qt.AlignRight
JamiSwitch {
id: autoupdate
Layout.alignment: Qt.AlignLeft
Layout.preferredWidth: widthOfSwitch
hoverEnabled: true
toolTipText: tooltipText
Accessible.role: Accessible.Button
Accessible.name: JamiStrings.autoUpdate
Accessible.description: root.tooltipText
onToggled: switchToggled()
}
Text {
id: description
Layout.rightMargin: JamiTheme.preferredMarginSize
text: JamiStrings.autoUpdate
font.pixelSize: JamiTheme.wizardViewButtonFontPixelSize
visible: labelText !== ""
font.kerning: true
wrapMode: Text.WordWrap
verticalAlignment: Text.AlignVCenter
color: JamiTheme.textColor
}
TapHandler {
target: parent
enabled: parent.visible
onTapped: function onTapped(eventPoint) {
// switchToggled should be emitted as onToggled is not called (because it's only called if the user click on the switch)
autoupdate.toggle();
switchToggled();
}
}
}

View File

@ -23,151 +23,185 @@ import net.jami.Adapters 1.1
import net.jami.Constants 1.1
Item {
id: root
id: jamiId
property bool slimDisplay: true
property color backgroundColor: JamiTheme.welcomeBlockColor
property color contentColor: JamiTheme.tintedBlue
property bool centered: true
height: getHeight()
property alias backgroundColor: outerRect.color
width: childrenRect.width
height: controlsLayout.height + usernameTextEdit.height + 2 * JamiTheme.preferredMarginSize
// Background rounded rectangle.
Rectangle {
id: outerRect
anchors.fill: parent
radius: 20
color: JamiTheme.secondaryBackgroundColor
function getHeight() {
return outerRow.height;
}
// Logo masked by outerRect.
Item {
anchors.fill: outerRect
layer.enabled: true
layer.effect: OpacityMask {
maskSource: outerRect
}
Rectangle {
id: logoRect
width: 97 + radius
height: 40
color: JamiTheme.mainColor
radius: 20
anchors.top: parent.top
anchors.left: parent.left
anchors.leftMargin: -radius
ResponsiveImage {
id: jamiIdLogo
anchors.horizontalCenter: parent.horizontalCenter
// Adjust offset for parent masking margin.
anchors.horizontalCenterOffset: parent.radius / 2
anchors.verticalCenter: parent.verticalCenter
width: JamiTheme.jamiIdLogoWidth
height: JamiTheme.jamiIdLogoHeight
source: JamiResources.jamiid_svg
}
}
}
ColumnLayout {
id: columnLayout
spacing: JamiTheme.preferredMarginSize
RowLayout {
id: controlsLayout
Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
Layout.topMargin: JamiTheme.pushButtonMargin / 2
Layout.rightMargin: JamiTheme.pushButtonMargin
Layout.preferredHeight: childrenRect.height
JamiIdControlButton {
id: btnEdit
visible: CurrentAccount.registeredName === ""
border.color: enabled ? JamiTheme.buttonTintedBlue : JamiTheme.buttonTintedBlack
imageColor: enabled ? JamiTheme.buttonTintedBlue : JamiTheme.buttonTintedBlack
enabled: {
if (!usernameTextEdit.editMode)
return true;
switch (usernameTextEdit.nameRegistrationState) {
case UsernameTextEdit.NameRegistrationState.BLANK:
case UsernameTextEdit.NameRegistrationState.FREE:
return true;
case UsernameTextEdit.NameRegistrationState.SEARCHING:
case UsernameTextEdit.NameRegistrationState.INVALID:
case UsernameTextEdit.NameRegistrationState.TAKEN:
return false;
}
}
source: usernameTextEdit.editMode ? JamiResources.check_black_24dp_svg : JamiResources.round_edit_24dp_svg
toolTipText: JamiStrings.chooseUsername
onClicked: {
if (usernameTextEdit.readOnly) {
usernameTextEdit.startEditing();
usernameTextEdit.readOnly = false;
} else {
usernameTextEdit.accepted();
}
}
}
JamiIdControlButton {
id: btnCopy
source: JamiResources.content_copy_24dp_svg
toolTipText: JamiStrings.copy
onClicked: UtilsAdapter.setClipboardText(usernameTextEdit.staticText)
}
JamiIdControlButton {
id: btnShare
source: JamiResources.share_24dp_svg
toolTipText: JamiStrings.share
onClicked: viewCoordinator.presentDialog(appWindow, "mainview/components/WelcomePageQrDialog.qml")
}
JamiIdControlButton {
id: btnId
source: JamiResources.key_black_24dp_svg
visible: CurrentAccount.registeredName !== ""
toolTipText: JamiStrings.identifierURI
onClicked: {
if (clicked) {
usernameTextEdit.staticText = CurrentAccount.uri;
btnId.toolTipText = JamiStrings.identifierRegisterName;
} else {
usernameTextEdit.staticText = CurrentAccount.registeredName;
btnId.toolTipText = JamiStrings.identifierURI;
}
clicked = !clicked;
}
}
}
UsernameTextEdit {
id: usernameTextEdit
Layout.preferredWidth: 330
Layout.preferredHeight: implicitHeight + JamiTheme.preferredMarginSize
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
Layout.leftMargin: JamiTheme.preferredMarginSize
Layout.rightMargin: JamiTheme.preferredMarginSize
fontPixelSize: JamiTheme.jamiIdFontSize
editMode: false
isPersistent: false
readOnly: true
onAccepted: {
Connections {
target: CurrentAccount
function onIdChanged(id) {
if (!usernameTextEdit.readOnly) {
usernameTextEdit.readOnly = true;
if (dynamicText === '') {
return;
}
}
}
RowLayout {
id: outerRow
anchors.horizontalCenter: jamiId.centered ? parent.horizontalCenter : undefined
anchors.left: jamiId.centered ? undefined : parent.left
spacing: 2
RoundedBorderRectangle {
id: leftRect
fillColor: jamiId.backgroundColor
Layout.preferredWidth: childrenRect.width
Layout.maximumWidth: jamiId.width - rightRect.width
Layout.preferredHeight: childrenRect.height
radius: {
"tl": 5,
"tr": 0,
"br": 0,
"bl": 5
}
RowLayout {
anchors.verticalCenter: parent.verticalCenter
ResponsiveImage {
id: jamiIdLogoImage
Layout.preferredHeight: 40
containerHeight: 40
containerWidth: 40
Layout.leftMargin: JamiTheme.pushButtonMargins
source: JamiResources.jami_id_logo_svg
color: jamiId.contentColor
}
UsernameTextEdit {
id: usernameTextEdit
visible: !readOnly
Layout.preferredHeight: 40
Layout.alignment: Qt.AlignVCenter
textColor: jamiId.contentColor
fontPixelSize: staticText.length > 16 || dynamicText.length > 16 ? JamiTheme.jamiIdSmallFontSize : JamiTheme.bigFontSize
editMode: false
isPersistent: false
readOnly: true
onAccepted: {
usernameTextEdit.readOnly = true;
if (dynamicText === '') {
return;
}
var dlg = viewCoordinator.presentDialog(appWindow, "settingsview/components/NameRegistrationDialog.qml", {
"registeredName": dynamicText
});
dlg.accepted.connect(function () {
usernameTextEdit.nameRegistrationState = UsernameTextEdit.NameRegistrationState.BLANK;
});
}
}
Label{
id: usernameLabel
visible: usernameTextEdit.readOnly
Layout.alignment: Qt.AlignVCenter
Layout.rightMargin: JamiTheme.pushButtonMargins
color: jamiId.contentColor
font.pixelSize : text.length > 16 ? JamiTheme.jamiIdSmallFontSize : JamiTheme.bigFontSize
property string registeredName: CurrentAccount.registeredName
property string infohash: CurrentAccount.uri
text: registeredName ? registeredName : infohash
}
}
}
RoundedBorderRectangle {
id: rightRect
fillColor: jamiId.backgroundColor
Layout.preferredWidth: childrenRect.width + 2 * JamiTheme.pushButtonMargins
Layout.preferredHeight: leftRect.height
radius: {
"tl": 0,
"tr": 5,
"br": 5,
"bl": 0
}
RowLayout {
id: controlsLayout
height: childrenRect.height
anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: JamiTheme.pushButtonMargins
anchors.leftMargin: JamiTheme.pushButtonMargins
anchors.horizontalCenter: parent.horizontalCenter
JamiIdControlButton {
id: btnEdit
anchors.leftMargin: JamiTheme.pushButtonMargins
visible: CurrentAccount.registeredName === ""
border.color: enabled ? jamiId.contentColor : JamiTheme.buttonTintedBlack
imageColor: enabled ? jamiId.contentColor : JamiTheme.buttonTintedBlack
enabled: {
if (!usernameTextEdit.editMode)
return true;
switch (usernameTextEdit.nameRegistrationState) {
case UsernameTextEdit.NameRegistrationState.BLANK:
case UsernameTextEdit.NameRegistrationState.FREE:
return true;
case UsernameTextEdit.NameRegistrationState.SEARCHING:
case UsernameTextEdit.NameRegistrationState.INVALID:
case UsernameTextEdit.NameRegistrationState.TAKEN:
return false;
}
}
source: usernameTextEdit.editMode ? JamiResources.check_black_24dp_svg : JamiResources.round_edit_24dp_svg
toolTipText: JamiStrings.chooseUsername
onClicked: {
if (usernameTextEdit.readOnly) {
usernameTextEdit.startEditing();
usernameTextEdit.readOnly = false;
} else {
usernameTextEdit.accepted();
}
}
}
JamiIdControlButton {
id: btnCopy
anchors.leftMargin: JamiTheme.pushButtonMargins
source: JamiResources.content_copy_24dp_svg
border.color: "transparent"
toolTipText: JamiStrings.copy
onClicked: UtilsAdapter.setClipboardText(usernameTextEdit.staticText)
}
JamiIdControlButton {
id: btnShare
source: JamiResources.share_24dp_svg
border.color: "transparent"
toolTipText: JamiStrings.share
onClicked: viewCoordinator.presentDialog(appWindow, "mainview/components/WelcomePageQrDialog.qml")
}
JamiIdControlButton {
id: btnId
source: JamiResources.key_black_24dp_svg
visible: CurrentAccount.registeredName !== ""
border.color: "transparent"
toolTipText: JamiStrings.identifierURI
onClicked: {
if (clicked) {
usernameLabel.text = Qt.binding(function() {return CurrentAccount.uri} );
usernameTextEdit.staticText = Qt.binding(function() {return CurrentAccount.uri} );
btnId.toolTipText = JamiStrings.identifierRegisterName;
} else {
usernameLabel.text = Qt.binding(function() {return CurrentAccount.registeredName} );
usernameTextEdit.staticText = Qt.binding(function() {return CurrentAccount.registeredName} );
btnId.toolTipText = JamiStrings.identifierURI;
}
clicked = !clicked;
}
}
var dlg = viewCoordinator.presentDialog(appWindow, "settingsview/components/NameRegistrationDialog.qml", {
"registeredName": dynamicText
});
dlg.accepted.connect(function () {
usernameTextEdit.nameRegistrationState = UsernameTextEdit.NameRegistrationState.BLANK;
});
}
}
}
@ -175,11 +209,12 @@ Item {
component JamiIdControlButton: PushButton {
property bool clicked: true
preferredSize: 30
radius: 5
normalColor: JamiTheme.transparentColor
hoveredColor: JamiTheme.hoveredButtonColorWizard
imageContainerWidth: JamiTheme.pushButtonSize
imageContainerHeight: JamiTheme.pushButtonSize
border.color: JamiTheme.tintedBlue
imageColor: JamiTheme.buttonTintedBlue
border.color: jamiId.contentColor
imageColor: jamiId.contentColor
duration: 0
}
}

View File

@ -30,14 +30,18 @@ Popup {
padding: 0
property list<Action> menuTypoActionsSecond
focus: true
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
contentItem: ListView {
id: listViewTypoSecond
width: contentWidth + leftMargin
width: contentWidth + leftMargin + rightMargin
height: JamiTheme.chatViewFooterButtonSize
orientation: ListView.Horizontal
interactive: false
leftMargin: 10
rightMargin: 10
spacing: 10
Rectangle {
@ -50,7 +54,7 @@ Popup {
model: menuTypoActionsSecond
delegate: PushButton {
anchors.verticalCenter: parent.verticalCenter
anchors.verticalCenter: parent ? parent.verticalCenter : undefined
preferredSize: JamiTheme.chatViewFooterRealButtonSize
imageContainerWidth: 20
@ -64,7 +68,7 @@ Popup {
focusPolicy: Qt.TabFocus
normalColor: JamiTheme.chatViewFooterListColor
imageColor: JamiTheme.chatViewFooterImgColor
imageColor: JamiTheme.chatViewFooterImgHoverColor
hoveredColor: JamiTheme.showMoreButtonOpenColor
pressedColor: hoveredColor

View File

@ -27,7 +27,6 @@ AbstractButton {
id: root
property bool autoAccelerator: false
property bool boldFont: false
property bool primary: false
property bool secondary: false
property bool tertiary: false
@ -51,12 +50,12 @@ AbstractButton {
height: buttontextHeightMargin + textButton.height
Layout.preferredHeight: height
Binding on width {
Binding on width {
when: root.preferredWidth !== undefined || root.Layout.fillWidth
value: root.preferredWidth
}
Binding on Layout.preferredWidth {
Binding on Layout.preferredWidth {
when: root.preferredWidth !== undefined || root.Layout.fillWidth
value: width
}
@ -66,7 +65,6 @@ AbstractButton {
value: height
}
hoverEnabled: true
focusPolicy: Qt.StrongFocus
Accessible.role: Accessible.Button
@ -96,7 +94,7 @@ AbstractButton {
contentItem: Item {
id: item
Binding on implicitWidth {
Binding on implicitWidth {
when: root.preferredWidth === undefined || !root.Layout.fillWidth
value: item.childrenRect.width
}
@ -105,7 +103,7 @@ AbstractButton {
RowLayout {
anchors.verticalCenter: parent.verticalCenter
Binding on width {
Binding on width {
when: root.preferredWidth !== undefined || root.Layout.fillWidth
value: root.availableWidth
}
@ -168,7 +166,6 @@ AbstractButton {
leftPadding: root.primary ? JamiTheme.buttontextWizzardPadding : textLeftPadding
rightPadding: root.primary ? JamiTheme.buttontextWizzardPadding : textRightPadding
text: root.text
font.weight: (root.hovered && root.hoverEnabled) || boldFont ? Font.Bold : Font.Medium
elide: Text.ElideRight
verticalAlignment: Text.AlignVCenter
horizontalAlignment: root.textAlignment
@ -183,18 +180,18 @@ AbstractButton {
color: {
var baseColor = root.color;
if (root.primary) {
if (root.hovered && root.hoverEnabled)
if (root.hovered && root.enabled)
return root.hoveredColor;
return baseColor;
}
if (root.secondary || root.tertiary) {
if (root.hovered && root.hoverEnabled)
if (root.hovered && root.enabled)
return root.secHoveredColor;
return JamiTheme.transparentColor;
}
if (root.down)
return root.pressedColor;
if (root.hovered && root.hoverEnabled)
if (root.hovered && root.enabled)
return root.hoveredColor;
return baseColor;
}
@ -202,7 +199,7 @@ AbstractButton {
border.color: {
if (root.primary || root.tertiary)
return JamiTheme.transparentColor;
if (root.secondary && root.hovered && root.hoverEnabled)
if (root.secondary && root.hovered && root.enabled)
return JamiTheme.secondaryButtonHoveredBorderColor;
if (root.secondary)
return JamiTheme.secondaryButtonBorderColor;
@ -226,7 +223,7 @@ AbstractButton {
// We don't want to eat clicks on the Text.
acceptedButtons: Qt.NoButton
cursorShape: (root.hovered && root.hoverEnabled) ? Qt.PointingHandCursor : Qt.ArrowCursor
cursorShape: (root.hovered && root.enabled) ? Qt.PointingHandCursor : Qt.ArrowCursor
}
Shortcut {

View File

@ -74,7 +74,7 @@ RadioButton {
spacing: 10
anchors.left: root.indicator.right
anchors.leftMargin: root.spacing
anchors.leftMargin: 10
ResponsiveImage {
color: borderColor
@ -89,6 +89,8 @@ RadioButton {
font.pixelSize: JamiTheme.settingsDescriptionPixelSize
text: root.text
wrapMode: Text.WordWrap
Layout.fillWidth: true
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
}
}
@ -100,7 +102,7 @@ RadioButton {
color: "transparent"
implicitHeight: 20
implicitWidth: 20
radius: JamiTheme.settingsBoxRadius
radius: 10
z: 1
border {
@ -114,7 +116,7 @@ RadioButton {
anchors.verticalCenter: parent.verticalCenter
color: checkedColor
height: 12
radius: JamiTheme.settingsBoxRadius
radius: 10
visible: checked || hovered
width: 12

View File

@ -49,6 +49,9 @@ Popup {
property bool closeWithoutAnimation: false
property var emojiPicker
focus: true
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
function xPositionProvider(width) {
// Use the width at function scope to retrigger property evaluation.
const listViewWidth = listView.width
@ -225,6 +228,18 @@ Popup {
}
}
MessageOptionButton {
visible: type === Interaction.Type.DATA_TRANSFER && Status === Interaction.Status.TRANSFER_FINISHED
textButton: JamiStrings.removeLocally
iconSource: JamiResources.trash_black_24dp_svg
Layout.fillWidth: true
Layout.margins: 5
onClicked: {
MessagesAdapter.removeFile(msgId, root.location)
close()
}
}
MessageOptionButton {
id: buttonEdit

View File

@ -35,9 +35,6 @@ BaseModalDialog {
signal done(bool success, int purpose)
width: Math.min(appWindow.width - 2 * JamiTheme.preferredMarginSize, JamiTheme.preferredDialogWidth)
height: Math.min(appWindow.height - 2 * JamiTheme.preferredMarginSize, JamiTheme.preferredDialogHeight)
title: {
switch (purpose) {
case PasswordDialog.ExportAccount:
@ -75,7 +72,7 @@ BaseModalDialog {
popupContent: ColumnLayout {
id: popupContentColumnLayout
spacing: 0
spacing: 16
function validatePassword() {
switch (purpose) {
@ -128,6 +125,8 @@ BaseModalDialog {
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: JamiTheme.preferredFieldWidth
Layout.preferredHeight: visible ? 48 : 0
Layout.leftMargin: JamiTheme.preferredMarginSize
Layout.rightMargin: JamiTheme.preferredMarginSize
visible: purpose === PasswordDialog.ChangePassword || purpose === PasswordDialog.ExportAccount
placeholderText: JamiStrings.enterCurrentPassword
@ -141,6 +140,8 @@ BaseModalDialog {
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: JamiTheme.preferredFieldWidth
Layout.preferredHeight: visible ? 48 : 0
Layout.leftMargin: JamiTheme.preferredMarginSize
Layout.rightMargin: JamiTheme.preferredMarginSize
visible: purpose === PasswordDialog.ChangePassword || purpose === PasswordDialog.SetPassword
@ -155,6 +156,8 @@ BaseModalDialog {
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: JamiTheme.preferredFieldWidth
Layout.preferredHeight: visible ? 48 : 0
Layout.leftMargin: JamiTheme.preferredMarginSize
Layout.rightMargin: JamiTheme.preferredMarginSize
visible: purpose === PasswordDialog.ChangePassword || purpose === PasswordDialog.SetPassword
@ -163,49 +166,24 @@ BaseModalDialog {
onDynamicTextChanged: popupContentColumnLayout.validatePassword()
}
RowLayout {
spacing: 16
Layout.fillWidth: true
Layout.alignment: Qt.AlignCenter
MaterialButton {
id: btnConfirm
MaterialButton {
id: btnConfirm
Layout.alignment: Qt.AlignHCenter
preferredWidth: JamiTheme.preferredFieldWidth / 2 - 8
Layout.alignment: Qt.AlignHCenter
color: enabled ? JamiTheme.buttonTintedBlack : JamiTheme.buttonTintedGrey
hoveredColor: JamiTheme.buttonTintedBlackHovered
pressedColor: JamiTheme.buttonTintedBlackPressed
secondary: true
autoAccelerator: true
enabled: purpose === PasswordDialog.SetPassword
preferredWidth: JamiTheme.preferredFieldWidth / 2 - 8
text: (purpose === PasswordDialog.ExportAccount) ? JamiStrings.exportAccount : JamiStrings.change
color: enabled ? JamiTheme.buttonTintedBlack : JamiTheme.buttonTintedGrey
hoveredColor: JamiTheme.buttonTintedBlackHovered
pressedColor: JamiTheme.buttonTintedBlackPressed
secondary: true
autoAccelerator: true
enabled: purpose === PasswordDialog.SetPassword
text: (purpose === PasswordDialog.ExportAccount) ? JamiStrings.exportAccount : JamiStrings.change
onClicked: {
btnConfirm.enabled = false;
timerToOperate.restart();
}
}
MaterialButton {
id: btnCancel
Layout.alignment: Qt.AlignHCenter
preferredWidth: JamiTheme.preferredFieldWidth / 2 - 8
color: JamiTheme.buttonTintedBlack
hoveredColor: JamiTheme.buttonTintedBlackHovered
pressedColor: JamiTheme.buttonTintedBlackPressed
secondary: true
autoAccelerator: true
text: JamiStrings.optionCancel
onClicked: close()
onClicked: {
btnConfirm.enabled = false;
timerToOperate.restart();
}
}
}

View File

@ -32,15 +32,12 @@ import "../mainview/components"
BaseModalDialog {
id: root
height: 157
x: - width / 2
y: - height / 5
property string imageId
property bool newItem
property real buttonSize: JamiTheme.smartListAvatarSize
property real imageSize: 25
signal focusOnPreviousItem
signal focusOnNextItem
@ -60,9 +57,15 @@ BaseModalDialog {
importButton.forceActiveFocus()
}
width: JamiTheme.preferredDialogWidth
title: JamiStrings.chooseAvatarPicture
RecordBox {
id: recordBox
anchors.centerIn: parent
isPhoto: true
visible: false
@ -77,223 +80,176 @@ BaseModalDialog {
}
}
popupContent: Item {
popupContent: RowLayout {
id: buttonsRowLayout
Component.onCompleted: {
root.width = Qt.binding(() => clearButton.visible ? 283 : 210)
}
Rectangle {
id: container
anchors.fill: parent
radius: JamiTheme.photoPopupRadius
color: JamiTheme.inviteHoverColor
spacing: 10
PushButton {
id: btnCancel
imageColor: "grey"
id: takePhotoButton
objectName: "takePhotoButton"
Layout.alignment: Qt.AlignHCenter
height: buttonSize
width: buttonSize
imageContainerWidth: imageSize
imageContainerHeight: imageSize
radius: height / 2
border.color: JamiTheme.buttonTintedBlue
normalColor: "transparent"
anchors.right: parent.right
anchors.top: parent.top
anchors.topMargin: 10
anchors.rightMargin: 10
source: JamiResources.round_close_24dp_svg
onClicked: { close();}
}
imageColor: JamiTheme.buttonTintedBlue
toolTipText: JamiStrings.takePhoto
source: JamiResources.baseline_camera_alt_24dp_svg
hoveredColor: JamiTheme.smartListHoveredColor
ColumnLayout {
id: mainLayout
anchors.fill: parent
anchors.margins: JamiTheme.preferredMarginSize
Text {
id: informativeLabel
Layout.alignment: Qt.AlignCenter
Layout.fillWidth: true
Layout.topMargin: 26
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: JamiStrings.chooseAvatarPicture
color: JamiTheme.primaryForegroundColor
font.pixelSize: JamiTheme.popupPhotoTextSize
elide: Text.ElideRight
Keys.onPressed: function (keyEvent) {
if (keyEvent.key === Qt.Key_Enter ||
keyEvent.key === Qt.Key_Return) {
clicked()
keyEvent.accepted = true
} else if (keyEvent.key === Qt.Key_Up) {
root.focusOnPreviousItem()
keyEvent.accepted = true
}
}
RowLayout {
id: buttonsRowLayout
Layout.preferredHeight: childrenRect.height
Layout.alignment: Qt.AlignCenter
spacing: 10
KeyNavigation.tab: {
if (clearButton.visible)
return clearButton
return importButton
}
KeyNavigation.down: KeyNavigation.tab
PushButton {
id: takePhotoButton
onClicked: {
recordBox.parent = buttonsRowLayout
objectName: "takePhotoButton"
recordBox.x = Qt.binding(function() {
var buttonCenterX = buttonsRowLayout.width / 2
return buttonCenterX - recordBox.width / 2
})
recordBox.y = Qt.binding(function() {
return - recordBox.height / 2
})
startBooth()
}
}
Layout.alignment: Qt.AlignHCenter
PushButton {
id: importButton
height: buttonSize
width: buttonSize
imageContainerWidth: imageSize
imageContainerHeight: imageSize
radius: height / 2
border.color: JamiTheme.buttonTintedBlue
normalColor: "transparent"
imageColor: JamiTheme.buttonTintedBlue
toolTipText: JamiStrings.takePhoto
source: JamiResources.baseline_camera_alt_24dp_svg
hoveredColor: JamiTheme.smartListHoveredColor
objectName: "photoboothViewImportButton"
Keys.onPressed: function (keyEvent) {
if (keyEvent.key === Qt.Key_Enter ||
keyEvent.key === Qt.Key_Return) {
clicked()
keyEvent.accepted = true
} else if (keyEvent.key === Qt.Key_Up) {
root.focusOnPreviousItem()
keyEvent.accepted = true
}
}
Layout.alignment: Qt.AlignHCenter
visible: parent.visible
KeyNavigation.tab: {
if (clearButton.visible)
return clearButton
return importButton
}
KeyNavigation.down: KeyNavigation.tab
height: buttonSize
width: buttonSize
imageContainerWidth: imageSize
imageContainerHeight: imageSize
radius: height / 2
border.color: JamiTheme.buttonTintedBlue
normalColor: "transparent"
source: JamiResources.round_folder_24dp_svg
toolTipText: JamiStrings.importFromFile
imageColor: JamiTheme.buttonTintedBlue
hoveredColor: JamiTheme.smartListHoveredColor
onClicked: {
recordBox.parent = buttonsRowLayout
recordBox.x = Qt.binding(function() {
var buttonCenterX = buttonsRowLayout.width / 2
return buttonCenterX - recordBox.width / 2
})
recordBox.y = Qt.binding(function() {
return - recordBox.height / 2
})
startBooth()
}
Keys.onPressed: function (keyEvent) {
if (keyEvent.key === Qt.Key_Enter ||
keyEvent.key === Qt.Key_Return) {
clicked()
keyEvent.accepted = true
} else if (keyEvent.key === Qt.Key_Down ||
keyEvent.key === Qt.Key_Tab) {
clearButton.forceActiveFocus()
keyEvent.accepted = true
}
}
PushButton {
id: importButton
KeyNavigation.up: takePhotoButton
objectName: "photoboothViewImportButton"
Layout.alignment: Qt.AlignHCenter
visible: parent.visible
height: buttonSize
width: buttonSize
imageContainerWidth: imageSize
imageContainerHeight: imageSize
radius: height / 2
border.color: JamiTheme.buttonTintedBlue
normalColor: "transparent"
source: JamiResources.round_folder_24dp_svg
toolTipText: JamiStrings.importFromFile
imageColor: JamiTheme.buttonTintedBlue
hoveredColor: JamiTheme.smartListHoveredColor
Keys.onPressed: function (keyEvent) {
if (keyEvent.key === Qt.Key_Enter ||
keyEvent.key === Qt.Key_Return) {
clicked()
keyEvent.accepted = true
} else if (keyEvent.key === Qt.Key_Down ||
keyEvent.key === Qt.Key_Tab) {
clearButton.forceActiveFocus()
keyEvent.accepted = true
}
onClicked: {
stopBooth()
var dlg = viewCoordinator.presentDialog(
appWindow,
"commoncomponents/JamiFileDialog.qml",
{
title: JamiStrings.chooseAvatarImage,
fileMode: JamiFileDialog.OpenFile,
folder: StandardPaths.writableLocation(
StandardPaths.PicturesLocation),
nameFilters: [JamiStrings.imageFiles,
JamiStrings.allFiles]
})
dlg.fileAccepted.connect(function(file) {
var filePath = UtilsAdapter.getAbsPath(file)
if (!root.newItem) {
AccountAdapter.setCurrentAccountAvatarFile(filePath)
} else {
UtilsAdapter.setTempCreationImageFromFile(filePath, root.imageId)
}
root.close()
})
}
}
KeyNavigation.up: takePhotoButton
PushButton {
id: clearButton
onClicked: {
stopBooth()
var dlg = viewCoordinator.presentDialog(
appWindow,
"commoncomponents/JamiFileDialog.qml",
{
title: JamiStrings.chooseAvatarImage,
fileMode: JamiFileDialog.OpenFile,
folder: StandardPaths.writableLocation(
StandardPaths.PicturesLocation),
nameFilters: [JamiStrings.imageFiles,
JamiStrings.allFiles]
})
dlg.fileAccepted.connect(function(file) {
var filePath = UtilsAdapter.getAbsPath(file)
if (!root.newItem) {
AccountAdapter.setCurrentAccountAvatarFile(filePath)
} else {
UtilsAdapter.setTempCreationImageFromFile(filePath, root.imageId)
}
root.close()
})
}
objectName: "photoboothViewClearButton"
Layout.alignment: Qt.AlignHCenter
height: buttonSize
width: buttonSize
imageContainerWidth: imageSize
imageContainerHeight: imageSize
radius: height / 2
border.color: JamiTheme.buttonTintedBlue
normalColor: "transparent"
source: JamiResources.ic_hangup_participant_24dp_svg
toolTipText: JamiStrings.clearAvatar
imageColor: JamiTheme.buttonTintedBlue
hoveredColor: JamiTheme.smartListHoveredColor
visible: {
if (!newItem && LRCInstance.currentAccountAvatarSet)
return true
if (newItem && UtilsAdapter.tempCreationImage(imageId).length !== 0)
return true
return false
}
KeyNavigation.up: importButton
Keys.onPressed: function (keyEvent) {
if (keyEvent.key === Qt.Key_Enter ||
keyEvent.key === Qt.Key_Return) {
clicked()
importButton.forceActiveFocus()
keyEvent.accepted = true
} else if (keyEvent.key === Qt.Key_Down ||
keyEvent.key === Qt.Key_Tab) {
btnCancel.forceActiveFocus()
keyEvent.accepted = true
}
}
PushButton {
id: clearButton
objectName: "photoboothViewClearButton"
Layout.alignment: Qt.AlignHCenter
height: buttonSize
width: buttonSize
imageContainerWidth: imageSize
imageContainerHeight: imageSize
radius: height / 2
border.color: JamiTheme.buttonTintedBlue
normalColor: "transparent"
source: JamiResources.ic_hangup_participant_24dp_svg
toolTipText: JamiStrings.clearAvatar
imageColor: JamiTheme.buttonTintedBlue
hoveredColor: JamiTheme.smartListHoveredColor
visible: {
if (!newItem && LRCInstance.currentAccountAvatarSet)
return true
if (newItem && UtilsAdapter.tempCreationImage(imageId).length !== 0)
return true
return false
}
KeyNavigation.up: importButton
Keys.onPressed: function (keyEvent) {
if (keyEvent.key === Qt.Key_Enter ||
keyEvent.key === Qt.Key_Return) {
clicked()
importButton.forceActiveFocus()
keyEvent.accepted = true
} else if (keyEvent.key === Qt.Key_Down ||
keyEvent.key === Qt.Key_Tab) {
btnCancel.forceActiveFocus()
keyEvent.accepted = true
}
}
onClicked: {
if (!root.newItem)
AccountAdapter.setCurrentAccountAvatarBase64()
else
UtilsAdapter.setTempCreationImageFromString("", imageId)
visible = false
stopBooth()
root.close()
}
}
onClicked: {
if (!root.newItem)
AccountAdapter.setCurrentAccountAvatarBase64()
else
UtilsAdapter.setTempCreationImageFromString("", imageId)
visible = false
stopBooth()
root.close()
}
}
}
}
}

View File

@ -85,7 +85,7 @@ ItemDelegate {
id: prefLlabel
Layout.fillWidth: true
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
Layout.leftMargin: 8
Layout.leftMargin: 20
text: preferenceName
color: JamiTheme.textColor
@ -103,7 +103,7 @@ ItemDelegate {
normalColor: JamiTheme.primaryBackgroundColor
Layout.alignment: Qt.AlignRight | Qt.AlingVCenter
Layout.rightMargin: 8
Layout.rightMargin: 20
Layout.preferredWidth: preferredSize
Layout.preferredHeight: preferredSize
imageColor: JamiTheme.textColor
@ -119,7 +119,7 @@ ItemDelegate {
visible: preferenceType === PreferenceItemListModel.SWITCH
Layout.alignment: Qt.AlignRight | Qt.AlingVCenter
Layout.rightMargin: 16
Layout.rightMargin: 20
Layout.preferredHeight: 30
Layout.preferredWidth: 30
checked: preferenceCurrentValue === "1"
@ -134,7 +134,7 @@ ItemDelegate {
visible: preferenceType === PreferenceItemListModel.LIST
Layout.preferredWidth: root.width / 2 - 8
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
Layout.rightMargin: 4
Layout.rightMargin: 20
font.pointSize: JamiTheme.settingsFontSize
font.kerning: true
@ -157,7 +157,7 @@ ItemDelegate {
buttontextHeightMargin: JamiTheme.buttontextHeightMargin
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
Layout.rightMargin: 4
Layout.rightMargin: 20
text: UtilsAdapter.fileName(preferenceCurrentValue)
toolTipText: JamiStrings.chooseImageFile
@ -176,7 +176,7 @@ ItemDelegate {
Layout.preferredWidth: root.width / 2 - 8
Layout.preferredHeight: 30
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
Layout.rightMargin: 4
Layout.rightMargin: 20
visible: preferenceType === PreferenceItemListModel.EDITTEXT
width: root.width / 2 - 8

View File

@ -64,7 +64,7 @@ Item {
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
selectByMouse: true
font.pixelSize: IsEmojiOnly ? JamiTheme.chatviewEmojiSize : JamiTheme.emojiBubbleSize
font.pixelSize: IsEmojiOnly ? JamiTheme.chatviewEmojiSize : JamiTheme.mediumFontSize
font.hintingPreference: Font.PreferNoHinting
renderType: Text.NativeRendering
textFormat: Text.MarkdownText

View File

@ -31,7 +31,9 @@ Item {
property alias source: image.source
property alias status: image.status
property alias fillMode: image.fillMode
property alias cache: image.cache
property alias image: image
property alias mirror: image.mirror
property string color: "transparent"
property bool hovered: false
@ -68,6 +70,7 @@ Item {
antialiasing: true
asynchronous: true
visible: false
mipmap: true
function setSourceSize() {
sourceSize = undefined;

View File

@ -0,0 +1,77 @@
/*
* Copyright (C) 2023 Savoir-faire Linux Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Qt5Compat.GraphicalEffects
import net.jami.Models 1.1
import net.jami.Adapters 1.1
import net.jami.Constants 1.1
Canvas {
property var radius
property string fillColor: Style.colorBGPrimary
onRadiusChanged: requestPaint()
onFillColorChanged: requestPaint()
//Draw rounded rectangle.
onPaint: {
var ctx = getContext("2d");
var r = {};
Object.assign(r, radius);
if (typeof r === 'undefined')
r = 0;
if (typeof r === 'number')
r = {
"tl": r,
"tr": r,
"br": r,
"bl": r
};
else {
var defaultRadius = {
"tl": 0,
"tr": 0,
"br": 0,
"bl": 0
};
for (var side in defaultRadius)
r[side] = r[side] || defaultRadius[side];
}
var x0 = 0;
var y0 = x0;
var x1 = width;
var y1 = height;
ctx.reset();
ctx.beginPath();
ctx.moveTo(x0 + r.tl, y0);
ctx.lineTo(x1 - r.tr, y0);
ctx.quadraticCurveTo(x1, y0, x1, y0 + r.tr);
ctx.lineTo(x1, y1 - r.br);
ctx.quadraticCurveTo(x1, y1, x1 - r.br, y1);
ctx.lineTo(x0 + r.bl, y1);
ctx.quadraticCurveTo(x0, y1, x0, y1 - r.bl);
ctx.lineTo(x0, y0 + r.tl);
ctx.quadraticCurveTo(x0, y0, x0 + r.tl, y0);
ctx.closePath();
ctx.fillStyle = fillColor;
ctx.fill();
}
}

View File

@ -60,10 +60,21 @@ Control {
property real textContentHeight
property bool isReply: ReplyTo !== ""
property real maxMsgWidth: root.width - senderMargin - 2 * hPadding - avatarBlockWidth
// If the ListView attached properties are not available,
// then the root delegate is likely a Loader.
readonly property ListView listView: ListView.view ? ListView.view : parent.ListView.view
function getBaseColor() {
var baseColor = isOutgoing ? CurrentConversation.color : JamiTheme.messageInBgColor;
if (Id === MessagesAdapter.replyToId || Id === MessagesAdapter.editId) {
// If we are replying to or editing the message
return Qt.darker(baseColor, 1.5);
}
return baseColor;
}
rightPadding: hPadding
leftPadding: hPadding
@ -90,14 +101,15 @@ Control {
id: usernameblock
Layout.preferredHeight: (seq === MsgSeq.first || seq === MsgSeq.single) ? 10 : 0
visible: !isReply
Layout.topMargin: (seq === MsgSeq.first || seq === MsgSeq.single) && !isOutgoing && !root.showTime ? 20 : 0
Label {
id: username
text: UtilsAdapter.getBestNameForUri(CurrentAccount.id, Author)
font.bold: true
visible: (seq === MsgSeq.first || seq === MsgSeq.single) && !isOutgoing
font.pixelSize: JamiTheme.usernameBlockFontSize
color: JamiTheme.chatviewUsernameColor
font.pointSize: JamiTheme.smallFontSize
color: JamiTheme.chatviewSecondaryInformationColor
lineHeight: JamiTheme.usernameBlockLineHeight
leftPadding: JamiTheme.usernameBlockPadding
textFormat: TextEdit.PlainText
@ -114,7 +126,7 @@ Control {
Layout.fillWidth: true
Layout.preferredHeight: childrenRect.height
Layout.topMargin: JamiTheme.sbsMessageBaseReplyTopMargin
Layout.topMargin: visible ? JamiTheme.sbsMessageBaseReplyTopMargin : 0
Layout.leftMargin: isOutgoing ? undefined : JamiTheme.sbsMessageBaseReplyMargin
Layout.rightMargin: !isOutgoing ? undefined : JamiTheme.sbsMessageBaseReplyMargin
@ -200,7 +212,7 @@ Control {
RowLayout {
id: msgRowlayout
Layout.preferredHeight: innerContent.height + root.extraHeight
Layout.preferredHeight: innerContent.height + root.extraHeight + (emojiReactions.emojis === "" ? 0 : emojiReactions.height - 8)
Layout.topMargin: ((seq === MsgSeq.first || seq === MsgSeq.single) && !root.isReply) ? 6 : 0
Item {
@ -322,17 +334,7 @@ Control {
out: isOutgoing
type: seq
isReply: root.isReply
function getBaseColor() {
var baseColor = isOutgoing ? CurrentConversation.color : JamiTheme.messageInBgColor;
if (Id === MessagesAdapter.replyToId || Id === MessagesAdapter.editId) {
// If we are replying to or editing the message
return Qt.darker(baseColor, 1.5);
}
return baseColor;
}
color: getBaseColor()
color: root.getBaseColor()
radius: msgRadius
anchors.right: isOutgoing ? parent.right : undefined
anchors.top: parent.top
@ -341,6 +343,55 @@ Control {
height: innerContent.childrenRect.height + (visible ? root.extraHeight : 0)
}
EmojiReactions {
id: emojiReactions
anchors.top: bubble.bottom
anchors.topMargin: -8
height: contentHeight + 5
reactions: Reactions
borderColor: root.getBaseColor()
maxWidth: 2 / 3 * maxMsgWidth - JamiTheme.emojiMargins
state: root.isOutgoing ? "anchorsRight" : (emojiReactions.width > bubble.width - JamiTheme.emojiMargins ? "anchorsLeft" : "anchorsRight")
TapHandler {
onTapped: {
reactionPopup.open();
}
}
states: [
State {
name: "anchorsRight"
AnchorChanges {
target: emojiReactions
anchors.right: bubble.right
anchors.left: undefined
}
PropertyChanges {
target: emojiReactions
anchors.rightMargin: JamiTheme.emojiMargins
anchors.leftMargin: 0
}
},
State {
name: "anchorsLeft"
AnchorChanges {
target: emojiReactions
anchors.right: undefined
anchors.left: bubble.left
}
PropertyChanges {
target: emojiReactions
anchors.rightMargin: 0
anchors.leftMargin: JamiTheme.emojiMargins
}
}
]
}
Rectangle {
id: bg
@ -439,25 +490,6 @@ Control {
}
}
EmojiReactions {
id: emojiReactions
property bool isOutgoing: Author === CurrentAccount.uri
Layout.alignment: isOutgoing ? Qt.AlignRight : Qt.AlignLeft
Layout.rightMargin: isOutgoing ? status.width : undefined
Layout.leftMargin: !isOutgoing ? avatarBlock.width : undefined
Layout.topMargin: -contentHeight / 4
Layout.preferredHeight: contentHeight + 5
Layout.preferredWidth: contentWidth
reactions: Reactions
TapHandler {
onTapped: {
reactionPopup.open();
}
}
}
ListView {
id: infoCell

View File

@ -0,0 +1,134 @@
/*
* Copyright (C) 2023 Savoir-faire Linux Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.platform
import Qt5Compat.GraphicalEffects
import net.jami.Models 1.1
import net.jami.Adapters 1.1
import net.jami.Constants 1.1
import "../mainview/components"
Popup {
id: root
padding: 0
property list<Action> menuMoreButton
height: childrenRect.height
width: childrenRect.width
focus: true
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
Rectangle {
id: rect
color: JamiTheme.primaryBackgroundColor
border.color: JamiTheme.chatViewFooterRectangleBorderColor
border.width: 2
radius: 5
height: listViewMoreButton.childrenRect.height + 16
width: listViewMoreButton.childrenRect.width + 16
ListView {
id: listViewMoreButton
anchors.centerIn: parent
orientation: ListView.Vertical
spacing: 0
width: contentItem.childrenRect.width
height: contentHeight
model: menuMoreButton
Rectangle {
z: -1
anchors.fill: parent
color: "transparent"
}
onCountChanged: {
for (var i = 0; i < count; i++) {
var item = listViewMoreButton.itemAtIndex(i);
item.width = listViewMoreButton.width;
}
}
delegate: ItemDelegate {
id: control
text: modelData.toolTip
contentItem: RowLayout {
Rectangle {
id: image
width: 26
height: 26
radius: 5
color: JamiTheme.transparentColor
ResponsiveImage {
anchors.fill: parent
source: modelData.iconSrc
color: control.hovered ? JamiTheme.chatViewFooterImgHoverColor : JamiTheme.chatViewFooterImgColor
}
}
Text {
Layout.alignment: Qt.AlignLeft
text: control.text
color: control.hovered ? JamiTheme.chatViewFooterImgHoverColor : "#7f7f7f"
}
}
background: Rectangle {
color: control.hovered ? JamiTheme.showMoreButtonOpenColor : JamiTheme.transparentColor
}
action: modelData
onClicked: {
root.close();
}
}
}
}
background: Rectangle {
anchors.fill: parent
color: JamiTheme.transparentColor
radius: 5
z: -1
}
enter: Transition {
NumberAnimation {
properties: "opacity"
from: 0.0
to: 1.0
duration: JamiTheme.shortFadeDuration
}
}
exit: Transition {
NumberAnimation {
properties: "opacity"
from: 1.0
to: 0.0
duration: JamiTheme.shortFadeDuration
}
}
}

View File

@ -44,9 +44,6 @@ BaseModalDialog {
open();
}
width: Math.max(JamiTheme.preferredDialogWidth, buttonTitles.length * (JamiTheme.preferredFieldWidth / 2 + JamiTheme.preferredMarginSize))
height: JamiTheme.preferredDialogHeight / 2 - JamiTheme.preferredMarginSize
popupContent: ColumnLayout {
Label {
id: infoTextLabel
@ -72,12 +69,10 @@ BaseModalDialog {
data: innerContentData
}
RowLayout {
spacing: JamiTheme.preferredMarginSize
Layout.fillWidth: true
Layout.preferredHeight: contentHeight
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
Layout.bottomMargin: JamiTheme.preferredMarginSize

View File

@ -32,9 +32,8 @@ Item {
property int spinningAnimationWidth: 4
property real outerCutRadius: root.height / 2
property int spinningAnimationDuration: 1000
property color color: "white"
visible: mode !== SpinningAnimation.Mode.Disabled
ConicalGradient {
id: conicalGradientOne
@ -48,7 +47,7 @@ Item {
}
GradientStop {
position: 1.0
color: "white"
color: mode === SpinningAnimation.Mode.Disabled ? "transparent" : root.color
}
}
@ -90,7 +89,7 @@ Item {
}
GradientStop {
position: 1.0
color: "white"
color: mode === SpinningAnimation.Mode.Disabled ? "transparent" : root.color
}
}

View File

@ -30,15 +30,14 @@ SBSMessageBase {
property bool isRemoteImage
property bool isEmojiOnly: IsEmojiOnly
property real maxMsgWidth: root.width - senderMargin - 2 * hPadding - avatarBlockWidth
property string colorUrl: UtilsAdapter.luma(bubble.color) ? JamiTheme.chatviewLinkColorLight : JamiTheme.chatviewLinkColorDark
property string colorText: UtilsAdapter.luma(bubble.color) ? JamiTheme.chatviewTextColorLight : JamiTheme.chatviewTextColorDark
Connections {
target: bubble
function onColorChanged(color) {
root.colorUrl = UtilsAdapter.luma(bubble.color) ? JamiTheme.chatviewLinkColorLight : JamiTheme.chatviewLinkColorDark
root.colorText = UtilsAdapter.luma(bubble.color) ? JamiTheme.chatviewTextColorLight : JamiTheme.chatviewTextColorDark
root.colorUrl = UtilsAdapter.luma(bubble.color) ? JamiTheme.chatviewLinkColorLight : JamiTheme.chatviewLinkColorDark;
root.colorText = UtilsAdapter.luma(bubble.color) ? JamiTheme.chatviewTextColorLight : JamiTheme.chatviewTextColorDark;
// Update parsed body with correct colors
if (Body !== "")
MessagesAdapter.parseMessage(Id, Body, UtilsAdapter.getAppValue(Settings.DisplayHyperlinkPreviews), root.colorUrl, bubble.color);
@ -65,7 +64,7 @@ SBSMessageBase {
text: {
if (Body !== "" && ParsedBody.length === 0) {
MessagesAdapter.parseMessage(Id, Body, UtilsAdapter.getAppValue(Settings.DisplayHyperlinkPreviews), root.colorUrl, bubble.color);
return ""
return "";
}
return (ParsedBody !== "") ? ParsedBody : "<i>(" + JamiStrings.deletedMessage + ")</i>";
}
@ -86,7 +85,7 @@ SBSMessageBase {
wrapMode: Label.WrapAtWordBoundaryOrAnywhere
selectByMouse: true
font.pixelSize: isEmojiOnly ? JamiTheme.chatviewEmojiSize : JamiTheme.emojiBubbleSize
font.pointSize: isEmojiOnly ? JamiTheme.chatviewEmojiSize : JamiTheme.mediumFontSize
font.hintingPreference: Font.PreferNoHinting
renderType: Text.NativeRendering
textFormat: Text.RichText
@ -277,5 +276,5 @@ SBSMessageBase {
duration: 100
}
}
Component.onCompleted: opacity = 1;
Component.onCompleted: opacity = 1
}

View File

@ -49,8 +49,7 @@ ColumnLayout {
Layout.preferredHeight: childrenRect.height
Layout.fillWidth: true
Layout.topMargin: JamiTheme.dayTimestampTopMargin
Layout.bottomMargin: formattedTimeLabel.visible ? 0 : JamiTheme.dayTimestampBottomMargin
Layout.topMargin: 30
Rectangle {
id: line
@ -95,12 +94,12 @@ ColumnLayout {
id: formattedTimeLabel
text: formattedTime
Layout.bottomMargin: JamiTheme.timestampBottomMargin
Layout.topMargin: JamiTheme.timestampTopMargin
Layout.topMargin: 30
Layout.bottomMargin: 30
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
color: JamiTheme.timestampColor
color: JamiTheme.chatviewSecondaryInformationColor
visible: showTime || showDay
Layout.preferredHeight: visible * implicitHeight
font.pointSize: JamiTheme.timestampFont
font.pointSize: JamiTheme.smallFontSize
}
}

View File

@ -35,7 +35,6 @@ Item {
property string incomingVideoCallFrom: qsTr("Incoming video call from {}")
property string startSwarm: qsTr("Start swarm")
property string createSwarm: qsTr("Create swarm")
property string showInvitations: qsTr("Show invitations")
property string invitations: qsTr("Invitations")
property string description: qsTr("Jami is a universal communication platform, with privacy as its foundation, that relies on a free distributed network for everyone.")
property string updateToSwarm: qsTr("Migrating to the Swarm technology will enable synchronizing this conversation across multiple devices and improve reliability. The legacy conversation history will be cleared in the process.")
@ -46,13 +45,10 @@ Item {
property string reconnectTry: qsTr("Trying to reconnect to the Jami daemon (jamid)…")
// AboutPopUp
property string version: qsTr("Version") + (UpdateManager.isCurrentVersionBeta() ? " (Beta)" : "")
property string companyDeclarationYear: declarationYear + " " + companyName
property string version: qsTr("Version") + (AppVersionManager.isCurrentVersionBeta() ? " (Beta)" : "")
property string declarationYear: "© 2015-2023"
property string companyName: "Savoir-faire Linux Inc."
property string slogan: "Világfa"
property string slogan: "Eleutheria"
property string declaration: qsTr("Jami is a free universal communication software that respects the freedom and privacy of its users.")
property string credits: qsTr("Credits")
// AccountComboBox
property string displayQRCode: qsTr("Display QR code")
@ -84,7 +80,6 @@ Item {
property string autoAnswerCalls: qsTr("Automatically answer calls")
property string enableCustomRingtone: qsTr("Enable custom ringtone")
property string selectCustomRingtone: qsTr("Select custom ringtone")
property string addCustomRingtone: qsTr("Add a custom ringtone")
property string selectNewRingtone: qsTr("Select a new ringtone")
property string certificateFile: qsTr("Certificate File (*.crt)")
property string audioFile: qsTr("Audio File (*.wav *.ogg *.opus *.mp3 *.aiff *.wma)")
@ -100,7 +95,6 @@ Item {
// AdvancedSIPSecuritySettings && AdvancedJamiSecuritySettings
property string security: qsTr("Security")
property string enableSDES: qsTr("Enable SDES key exchange")
property string fallbackRTP: qsTr("Allow fallback on RTP")
property string encryptNegotiation: qsTr("Encrypt negotiation (TLS)")
property string caCertificate: qsTr("CA certificate")
property string userCertificate: qsTr("User certificate")
@ -110,7 +104,6 @@ Item {
property string verifyCertificatesClient: qsTr("Verify server TLS certificates")
property string tlsRequireConnections: qsTr("Require certificate for incoming TLS connections")
property string disableSecureDlgCheck: qsTr("Disable secure dialog check for incoming TLS data")
property string audioDeviceSelector: qsTr("Audio input device selector")
property string selectPrivateKey: qsTr("Select a private key")
property string selectUserCert: qsTr("Select a user certificate")
property string selectCACert: qsTr("Select a CA certificate")
@ -167,7 +160,7 @@ Item {
property string back: qsTr("Back")
property string accountSettingsMenuTitle: qsTr("Account")
property string generalSettingsTitle: qsTr("General")
property string pluginSettingsTitle: qsTr("Plugins")
property string pluginSettingsTitle: qsTr("Extensions")
property string enableAccountSettingsTitle: qsTr("Enable account")
property string manageAccountSettingsTitle: qsTr("Manage account")
property string linkedDevicesSettingsTitle: qsTr("Linked devices")
@ -197,21 +190,17 @@ Item {
property string selectFPS: qsTr("Select video frame rate (frames per second)")
property string enableHWAccel: qsTr("Enable hardware acceleration")
property string mirrorLocalVideo: qsTr("Mirror local video")
property string previewUnavailable: qsTr("Preview unavailable")
property string screenSharing: qsTr("Screen sharing")
property string selectScreenSharingFPS: qsTr("Select screen sharing frame rate (frames per second)")
property string noVideo: qsTr("no video")
// BackupKeyPage
property string whyBackupAccount: qsTr("Why should I back-up this account?")
property string backupAccountInfos: qsTr("Your account only exists on this device. " + "If you lose your device or uninstall the application, " + "your account will be deleted and CANNOT be recovered. " + "You can back up your account now or later (in the Account Settings).")
property string backupAccountInfos: qsTr("Your account only exists on this device. " + "If you lose your device or uninstall the application, " + "your account will be deleted and CANNOT be recovered. " + "You can <a href='blank'> back up your account </a> now or later (in the Account Settings).")
property string backupAccountHere: qsTr("Back up account here")
property string backupAccountBtn: qsTr("Back up account")
property string skip: qsTr("Skip")
property string success: qsTr("Success")
property string error: qsTr("Error")
property string neverShowAgain: qsTr("Never show me this again")
property string recommended: qsTr("Recommended")
property string jamiArchiveFiles: qsTr("Jami archive files (*.gz)")
property string allFiles: qsTr("All files (*)")
@ -223,8 +212,6 @@ Item {
// CallOverlay
property string isRecording: qsTr("is recording")
property string areRecording: qsTr("are recording")
property string peerStoppedRecording: qsTr("Peer stopped recording")
property string isCallingYou: qsTr("is calling you")
property string mute: qsTr("Mute")
property string unmute: qsTr("Unmute")
property string pauseCall: qsTr("Pause call")
@ -267,17 +254,14 @@ Item {
property string confirmBlockConversation: qsTr("Would you really like to block this conversation?")
property string removeContact: qsTr("Remove contact")
property string blockContact: qsTr("Block contact")
property string blockSwarm: qsTr("Block swarm")
property string convDetails: qsTr("Conversation details")
property string contactDetails: qsTr("Contact details")
// CallViewContextMenu
property string hold: qsTr("Hold")
property string sipInputPanel: qsTr("Sip input panel")
property string transferCall: qsTr("Transfer call")
property string stopRec: qsTr("Stop recording")
property string startRec: qsTr("Start recording")
property string exitFullScreen: qsTr("Exit full screen")
property string viewFullScreen: qsTr("View full screen")
property string shareScreen: qsTr("Share screen")
property string shareWindow: qsTr("Share window")
@ -312,10 +296,6 @@ Item {
// Share location/position
property string shareLocation: qsTr("Share location")
property string stopSharingLocation: qsTr("Stop sharing")
property string shortSharing: qsTr("10 minutes")
property string longSharing: qsTr("One hour")
property string minutesLeft: qsTr("%1 minutes left")
property string minuteLeft: qsTr("%1 minute left")
property string locationServicesError: qsTr("Your precise location could not be determined.\nIn Device Settings, please turn on \"Location Services\".\nOther participants' location can still be received.")
property string locationServicesClosedError: qsTr("Your precise location could not be determined. Please check your Internet connection.")
property string stopAllSharings: qsTr("Turn off location sharing")
@ -325,20 +305,22 @@ Item {
property string unpinStopSharingTooltip: qsTr("Pin map to be able to share location or to turn off location in specific conversations")
property string stopSharingSeveralConversationTooltip: qsTr("Location is shared in several conversations, click to choose how to turn off location sharing")
property string shareLocationToolTip: qsTr("Share location to participants of this conversation (%1)")
property string minimizeMapTooltip: qsTr("Minimize")
property string maximizeMapTooltip: qsTr("Maximize")
property string reduceMapTooltip: qsTr("Reduce")
property string extendMapTooltip: qsTr("Extend")
property string dragMapTooltip: qsTr("Drag")
property string centerMapTooltip: qsTr("Center")
property string closeMapTooltip: qsTr("Close")
property string unpin: qsTr("Unpin")
property string pinWindow: qsTr("Pin")
property string positionShareDuration: qsTr("Position share duration")
property string positionShareLimit: qsTr("Limit the duration of location sharing")
property string locationSharingLabel: qsTr("Location sharing")
property string maxLocationDuration: qsTr("Unlimited")
property string minLocationDuration: qsTr("1 min")
property string xhourxmin: qsTr("%1h%2min")
property string xhour: qsTr("%1h")
property string xminxsec: qsTr("%1min%2s")
property string xmin: qsTr("%1min")
property string xsec: qsTr("%sec")
// Chatview header
property string hideChat: qsTr("Hide chat")
@ -367,24 +349,16 @@ Item {
// ConnectToAccountManager
property string enterJAMSURL: qsTr("Enter the Jami Account Management Server (JAMS) URL")
property string required: qsTr("Required")
property string jamiManagementServerURL: qsTr("Jami Account Management Server URL")
property string jamsCredentials: qsTr("Enter JAMS credentials")
property string connect: qsTr("Connect")
property string creatingAccount: qsTr("Creating account…")
property string backToWelcome: qsTr("Back to welcome page")
// CreateAccountPage
property string chooseName: qsTr("Choose name")
property string chooseUsername: qsTr("Choose username")
property string chooseAUsername: qsTr("Choose a username")
property string chooseIdentifier: qsTr("Choose an identifier")
property string identifierNotAvailable: qsTr("The identifier is not available")
property string createPassword: qsTr("Encrypt account with password")
property string createAccount: qsTr("Create account")
property string confirmPassword: qsTr("Confirm password")
property string notePasswordRecovery: qsTr("Choose a password to encrypt your account on this device. Note that the password CANNOT be recovered.")
property string optional: qsTr("Optional")
property string chooseUsernameForAccount: qsTr("You can choose a username to help others more easily find and reach you on Jami.")
property string chooseUsernameForRV: qsTr("Choose a name for your rendezvous point")
property string chooseAName: qsTr("Choose a name")
@ -408,7 +382,6 @@ Item {
property string sipAccount: qsTr("SIP account")
property string proxy: qsTr("Proxy")
property string server: qsTr("Server")
property string createSIPAccount: qsTr("Create SIP account")
property string configureExistingSIP: qsTr("Configure an existing SIP account")
property string personalizeAccount: qsTr("Personalize account")
property string addSip: qsTr("Add SIP account")
@ -419,7 +392,7 @@ Item {
// accountSettingsPages
property string customizeAccountDescription: qsTr("Your profile is only shared with your contacts.\nYour picture and your nickname can be changed at all time in the settings of your account.")
property string usernameAccountDescription: qsTr("A chosen username can help to be found more easily on Jami.\nIf a username is not chosen, a randomly generated 40-character identifier will be assigned to this account as a username. It is more difficult to be found and reached with this identifier.")
property string ecryptAccountDescription: qsTr("Your Jami account is registered only on this device as an archive containing the keys of your account. Access to this archive can be protected by a password.")
property string encryptAccountDescription: qsTr("Your Jami account is registered only on this device as an archive containing the keys of your account. Access to this archive can be protected by a password.")
property string saveAccountTitle: qsTr("Backup account")
property string saveAccountDescription: qsTr("This Jami account exists only on this device.\nThe account will be lost if this device is lost or the application is uninstalled. It is recommended to make a backup of this account.")
property string deleteAccountTitle: qsTr("Delete your account")
@ -427,7 +400,6 @@ Item {
property string linkedAccountList: qsTr("List of the devices that are linked to this account:")
property string linkedThisDevice: qsTr("This device")
property string linkedOtherDevices: qsTr("Other linked devices")
property string linkedAccountDescription: qsTr("Linking this account to other devices enables it to be used on other devices.")
// CurrentAccountSettings && AdvancedSettings
property string backupSuccessful: qsTr("Backup successful")
@ -450,20 +422,20 @@ Item {
property string encryptTitle: qsTr("Encrypt account with a password")
property string encryptDescription: qsTr("A Jami account is created and stored locally only on this device, as an archive containing your account keys. Access to this archive can optionally be protected by a password.")
property string encryptWarning: qsTr("Please note that if you lose your password, it CANNOT be recovered!")
property string enterNickname: qsTr("Enter a nickname, surname...")
property string enterNickname: qsTr("Enter a nickname, surname")
property string linkTitle: qsTr("Use this account on other devices")
property string linkDescription: qsTr("This account is created and stored locally, if you want to use it on another device you have to link the new device to this account.")
property string linkAnotherDevice: qsTr("Link device")
// NameRegistrationDialog
property string setUsername: qsTr("Set username")
property string registeringName: qsTr("Registering name")
// JamiUserIdentity
property string registerAUsername: qsTr("Register a username")
property string registerUsername: qsTr("Register username")
property string identity: qsTr("Identity")
// LinkedDevices
property string tipLinkNewDevice: qsTr("Link a new device to this account")
property string linkAnotherDevice: qsTr("Link a new device")
property string linkNewDevice: qsTr("Exporting account…")
property string removeDevice: qsTr("Remove Device")
property string sureToRemoveDevice: qsTr("Are you sure you wish to remove this device?")
@ -471,9 +443,7 @@ Item {
property string linkDeviceNetWorkError: qsTr("Error connecting to the network.\nPlease try again later.")
// BannedContacts
property string tipBannedContactsDisplay: qsTr("Display banned contacts")
property string banned: qsTr("Banned")
property string tipBannedContactsHide: qsTr("Hide banned contacts")
property string bannedContacts: qsTr("Banned contacts")
// DeleteAccountDialog
@ -483,6 +453,7 @@ Item {
// DeviceItemDelegate
property string saveNewDeviceName: qsTr("Save")
property string editDeviceName: qsTr("Edit")
property string deviceName: qsTr("Device name:")
property string unlinkDevice: qsTr("Remove")
property string deviceId: qsTr("Device Id")
@ -492,16 +463,12 @@ Item {
property string light: qsTr("Light")
property string selectFolder: qsTr("Select a folder")
property string enableNotifications: qsTr("Enable notifications")
property string applicationTheme: qsTr("Application theme")
property string showNotifications: qsTr("Show notifications")
property string keepMinimized: qsTr("Minimize on close")
property string tipRunStartup: qsTr("Run at system startup")
property string runStartup: qsTr("Launch at startup")
property string downloadFolder: qsTr("Choose download directory")
property string tipChooseDownloadFolder: qsTr("Choose download directory")
property string includeLocalVideo: qsTr("Include local video in recording")
property string textZoom: qsTr("Text zoom")
property string changeTextSize: qsTr("Change text size (%)")
property string defaultSettings: qsTr("Default settings")
// ChatviewSettings
@ -510,7 +477,6 @@ Item {
property string displayHyperlinkPreviews: qsTr("Show link preview in conversations")
property string displayHyperlinkPreviewsDescription: qsTr("Preview requires downloading content from third-party servers.")
property string layout: qsTr("Layout")
property string language: qsTr("User interface language")
property string verticalViewOpt: qsTr("Vertical view")
property string horizontalViewOpt: qsTr("Horizontal view")
@ -530,13 +496,12 @@ Item {
// Context Menu
property string saveFile: qsTr("Save file")
property string openLocation: qsTr("Open location")
property string me: qsTr("Me")
property string removeLocally: qsTr("Delete file from device")
// Updates
property string betaInstall: qsTr("Install beta version")
property string checkForUpdates: qsTr("Check for updates now")
property string enableAutoUpdates: qsTr("Enable/Disable automatic updates")
property string tipAutoUpdate: qsTr("Toggle automatic updates")
property string updatesTitle: qsTr("Updates")
property string updateDialogTitle: qsTr("Update")
property string updateFound: qsTr("A new version of Jami was found\nWould you like to update now?")
@ -559,7 +524,6 @@ Item {
property string experimentalCallSwarmTooltip: qsTr("This feature will enable call buttons in swarms with multiple participants.")
// Recording Settings
property string tipRecordFolder: qsTr("Select a record directory")
property string quality: qsTr("Quality")
property string saveRecordingsTo: qsTr("Save recordings to")
property string saveScreenshotsTo: qsTr("Save screenshots to")
@ -573,27 +537,9 @@ Item {
property string callKeyboardShortcuts: qsTr("Call")
property string settings: qsTr("Settings")
property string markdownKeyboardShortcuts: qsTr("Markdown")
property string openAccountList: qsTr("Open account list")
property string focusConversationsList: qsTr("Focus conversations list")
property string requestsList: qsTr("Requests list")
property string previousConversation: qsTr("Previous conversation")
property string nextConversation: qsTr("Next conversation")
property string searchBar: qsTr("Search bar")
property string fullScreen: qsTr("Full screen")
property string clearHistory: qsTr("Clear history")
property string mediaSettings: qsTr("Media settings")
property string generalSettings: qsTr("General settings")
property string pluginSettings: qsTr("Plugin settings")
property string answerIncoming: qsTr("Answer an incoming call")
property string declineCallRequest: qsTr("Decline the call request")
property string openAccountCreationWizard: qsTr("Open account creation wizard")
property string openKeyboardShortcutTable: qsTr("Open keyboard shortcut table")
// View Logs
property string logsViewTitle: qsTr("Debug")
property string logsViewShowStats: qsTr("Show Stats")
property string logsViewStart: qsTr("Start")
property string logsViewStop: qsTr("Stop")
property string logsViewCopy: qsTr("Copy")
property string logsViewReport: qsTr("Report Bug")
property string logsViewClear: qsTr("Clear")
@ -605,19 +551,14 @@ Item {
property string archive: qsTr("Archive")
property string openFile: qsTr("Open file")
property string importAccountArchive: qsTr("Create account from backup")
property string importAccountExplanation: qsTr("You can obtain an archive by clicking on \"Back up account\" " + "in the Account Settings. " + "This will create a .gz file on your device.")
property string connectFromBackup: qsTr("Restore account from backup")
property string generatingAccount: qsTr("Generating account…")
property string importFromBackup: qsTr("Import from backup")
property string importFromArchiveBackup: qsTr("Import from archive backup")
property string importFromArchiveBackupDescription: qsTr("Import Jami account from local archive file.")
property string selectArchiveFile: qsTr("Select archive file")
property string passwordArchive: qsTr("If the account is encrypted with a password, please fill the following field.")
// ImportFromDevicePage
property string mainAccountPassword: qsTr("Enter Jami account password")
property string enterPIN: qsTr("Enter the PIN from another configured Jami account. " + "Use the \"Link Another Device\" feature to obtain a PIN.")
property string connectFromAnotherDevice: qsTr("Link device")
property string importButton: qsTr("Import")
property string pin: qsTr("Enter the PIN code")
property string importFromDeviceDescription: qsTr("A PIN is required to use an existing Jami account on this device.")
@ -644,52 +585,53 @@ Item {
property string enterNewPassword: qsTr("Enter new password")
property string confirmNewPassword: qsTr("Confirm new password")
property string change: qsTr("Change")
property string confirm: qsTr("Confirm")
property string exportAccount: qsTr("Export")
// PhotoBoothView
property string chooseAvatarImage: qsTr("Choose a picture as your avatar")
property string chooseAvatarPicture: qsTr("Choose a picture")
property string importFromFile: qsTr("Import avatar from image file")
property string stopTakingPhoto: qsTr("Stop taking photo")
property string clearAvatar: qsTr("Clear avatar image")
property string takePhoto: qsTr("Take photo")
property string imageFiles: qsTr("Image Files (*.png *.jpg *.jpeg *.JPG *.JPEG *.PNG)")
// Plugins
property string enable: qsTr("Enable")
property string autoUpdate: qsTr("Auto update")
property string disableAll: qsTr("Disable all")
property string installed: qsTr("Installed")
property string install: qsTr("Install")
property string installing: qsTr("Installing")
property string installManually: qsTr("Install manually")
property string installMannuallyDescription: qsTr("Install an extension directly from your device.")
property string pluginStoreTitle: qsTr("Available")
property string pluginStoreNotAvailable: qsTr("Plugins store is not available")
property string pluginPreferences: qsTr("Preferences")
property string installationFailed: qsTr("Installation failed")
property string pluginInstallationFailed: qsTr("The installation of the plugin failed")
property string reset: qsTr("Reset")
property string uninstall: qsTr("Uninstall")
property string resetPreferences: qsTr("Reset Preferences")
property string selectPluginInstall: qsTr("Select a plugin to install")
property string installPlugin: qsTr("Install plugin")
property string uninstallPlugin: qsTr("Uninstall plugin")
property string pluginResetConfirmation: qsTr("Are you sure you wish to reset %1 preferences?")
property string pluginUninstallConfirmation: qsTr("Are you sure you wish to uninstall %1?")
property string showHidePrefs: qsTr("Display or hide preferences")
property string addNewPlugin: qsTr("Add new plugin")
property string goBackToPluginsList: qsTr("Go back to plugins list")
property string selectFile: qsTr("Select a file")
property string select: qsTr("Select")
property string chooseImageFile: qsTr("Choose image file")
property string tipGeneralPluginSettingsDisplay: qsTr("Display or hide General plugin settings")
property string tipAccountPluginSettingsDisplay: qsTr("Display or hide Account plugin settings")
property string installedPlugins: qsTr("Installed plugins")
property string pluginFiles: qsTr("Plugin Files (*.jpl)")
property string loadUnload: qsTr("Load/Unload")
property string selectAnImage: qsTr("Select An Image to %1")
property string editPreference: qsTr("Edit preference")
property string onOff: qsTr("On/Off")
property string choosePlugin: qsTr("Choose Plugin")
property string versionPlugin: qsTr("Version %1")
property string lastUpdate: qsTr("Last update %1")
property string by: qsTr("By %1")
property string proposedBy: qsTr("Proposed by %1")
// ProfilePage
property string profileSharedWithContacts: qsTr("Profile is only shared with contacts")
property string saveProfile: qsTr("Save profile")
property string enterYourName: qsTr("Enter your name")
property string enterRVName: qsTr("Enter the rendezvous point's name")
property string generatingRV: qsTr("Creating rendezvous point…")
property string information: qsTr("Information")
property string moreInformation: qsTr("More information")
property string profile: qsTr("Profile")
// RevokeDevicePasswordDialog
@ -706,11 +648,7 @@ Item {
// UserProfile
property string qrCode: qsTr("QR code")
// Account QR
property string accountQr: qsTr("Account QR")
// WelcomePage
property string shareInvite: qsTr("This is your Jami username.\nCopy and share it with your friends!")
property string linkFromAnotherDevice: qsTr("Link this device to an existing account")
property string importAccountFromAnotherDevice: qsTr("Import from another device")
property string importAccountFromBackup: qsTr("Import from an archive backup")
@ -722,12 +660,10 @@ Item {
property string addSIPAccount: qsTr("Configure a SIP account")
property string errorCreateAccount: qsTr("Error while creating your account. Check your credentials.")
property string createNewRV: qsTr("Create a rendezvous point")
property string createAJamiAccount: qsTr("Create a Jami account")
property string joinJami: qsTr("Join Jami")
property string createNewJamiAccount: qsTr("Create new Jami account")
property string createNewSipAccount: qsTr("Create new SIP account")
property string aboutJami: qsTr("About Jami")
property string welcomeTo: qsTr("Welcome to")
property string introductionJami: qsTr("Share freely and privately with Jami")
property string alreadyHaveAccount: qsTr("I already have an account")
property string useExistingAccount: qsTr("Use existing Jami account")
@ -736,7 +672,6 @@ Item {
// SmartList
property string clearText: qsTr("Clear Text")
property string conversations: qsTr("Conversations")
property string conversation: qsTr("Conversation")
property string searchResults: qsTr("Search Results")
// SmartList context menu
@ -768,7 +703,6 @@ Item {
property string localMuted: qsTr("Local muted")
// Settings moderation
property string conferenceModeration: qsTr("Conference moderation")
property string defaultModerators: qsTr("Default moderators")
property string enableLocalModerators: qsTr("Enable local moderators")
property string enableAllModerators: qsTr("Make all participants moderators")
@ -780,34 +714,31 @@ Item {
property string reconnectDaemon: qsTr("Trying to reconnect to the Jami daemon (jamid)…")
property string reconnectionFailed: qsTr("Could not re-connect to the Jami daemon (jamid).\nJami will now quit.")
// Is Swarm
property string isSwarm: qsTr("Is swarm:")
property string trueStr: qsTr("True")
property string falseStr: qsTr("False")
// Message view
property string addEmoji: qsTr("Add emoji")
property string moreEmojis: qsTr("more emojis")
property string sendFile: qsTr("Send file")
property string leaveAudioMessage: qsTr("Leave audio message")
property string leaveVideoMessage: qsTr("Leave video message")
property string leaveAudioMessage: qsTr("Audio message")
property string leaveVideoMessage: qsTr("Video message")
property string showMore: qsTr("Show more")
property string showLess: qsTr("Show less")
property string showPreview: qsTr("Show preview")
property string bold: qsTr("Bold")
property string italic: qsTr("Italic")
property string strikethrough: qsTr("Strikethrough")
property string title: qsTr("Title")
property string heading: qsTr("Heading")
property string link: qsTr("Link")
property string code: qsTr("Code")
property string quote: qsTr("Quote")
property string unorderedList: qsTr("Unordered list")
property string orderedList: qsTr("Ordered list")
property string showFormating: qsTr("Show Formating")
property string hideFormating: qsTr("Hide Formating")
property string showFormatting: qsTr("Show formatting")
property string hideFormatting: qsTr("Hide formatting")
property string shiftEnterNewLine: qsTr("Press Shift+Enter to insert a new line")
property string enterNewLine: qsTr("Press Enter to insert a new line")
property string send: qsTr("Send")
property string remove: qsTr("Remove")
property string replyTo: qsTr("Reply to")
property string inReplyTo: qsTr("In reply to")
property string repliedTo: qsTr(" replied to")
@ -833,10 +764,8 @@ Item {
property string invitationViewWaitingForSync: qsTr("Waiting until %1\nconnects to synchronize the conversation.")
// SwarmDetailsPanel
property string about: qsTr("About")
property string members: qsTr("%1 Members")
property string member: qsTr("Member")
property string documents: qsTr("Documents")
property string swarmName: qsTr("Swarm's name")
property string contactName: qsTr("Contact's name")
property string addADescription: qsTr("Add a description")
@ -846,14 +775,12 @@ Item {
property string chooseAColor: qsTr("Choose a color")
property string defaultCallHost: qsTr("Default host (calls)")
property string leaveConversation: qsTr("Leave conversation")
property string leave: qsTr("Leave")
property string typeOfSwarm: qsTr("Type of swarm")
property string none: qsTr("None")
// NewSwarmPage
property string createTheSwarm: qsTr("Create the swarm")
property string goToConversation: qsTr("Go to conversation")
property string promoteAdministrator: qsTr("Promote to administrator")
property string kickMember: qsTr("Kick member")
property string reinstateMember: qsTr("Reinstate member")
property string administrator: qsTr("Administrator")
@ -866,9 +793,7 @@ Item {
property string tip: qsTr("Tip")
property string dismiss: qsTr("Dismiss")
property string customizeText: qsTr("Add a profile picture and nickname to complete your profile")
property string customizationDescription: qsTr("This profile is only shared with this account's contacts")
property string customizationDescription2: qsTr("Your profile is only shared with your contacts")
property string whySaveAccount: qsTr("Why should I save my account?")
property string customizationDescription: qsTr("Your profile is only shared with your contacts")
// Message options
property string deleteMessage: qsTr("Delete message")
@ -876,8 +801,7 @@ Item {
property string editMessage: qsTr("Edit message")
// Jami identifier
property string identifierDescription: qsTr("Share this Jami identifier to be contacted on this account!")
property string hereIsIdentifier: qsTr("Here is your Jami identifier, don't hesitate to share it in order to be contacted more easily!")
property string hereIsIdentifier: qsTr("Share your Jami identifier in order to be contacted more easily!")
property string jamiIdentity: qsTr("Jami identity")
property string identifierURI: qsTr("Show fingerprint")
property string identifierRegisterName: qsTr("Show registered name")

View File

@ -58,9 +58,13 @@ Item {
property color blackColor: "#000000"
property color redColor: "red"
property color whiteColor: "#ffffff"
property color darkBlueGreen: "#123F4A"
property color darkGreyColor: "#272727"
property color darkGreyColorOpacityFade: "#cc000000" // 80%
property color darkGreyColorOpacity: "#be272727" // 77%
property color tintedBlue: darkTheme ? "#03B9E9" : "#005699"
property color tintedBlue: darkTheme ? lightTintedBlue : darkTintedBlue
property color lightTintedBlue: "#03B9E9"
property color darkTintedBlue: "#005699"
property color sysColor: "#F0EFEF"
property color transparentColor: "transparent"
@ -72,11 +76,11 @@ Item {
property color greyBorderColor: "#333"
property color selectionBlue: darkTheme ? "#0061a5" : "#109ede"
property color hoverColor: darkTheme ? "#515151" : "#c7c7c7"
property color hoverColor: darkTheme ? "#4d4d4d" : "#c7c7c7"
property color pressColor: darkTheme ? "#777" : "#c0c0c0"
property color selectedColor: darkTheme ? "#0e81c5" : "#e0e0e0"
property color smartListHoveredColor: darkTheme ? "#444444" : "#dedede"
property color smartListSelectedColor: darkTheme ? "#515151" : "#d1d1d1"
property color smartListHoveredColor: darkTheme ? "#4d4d4d" : "#dedede"
property color smartListSelectedColor: darkTheme ? "#4d4d4d" : "#dedede"
property color editBackgroundColor: darkTheme ? "#373737" : lightGrey_
property color textColor: primaryForegroundColor
property color textColorHovered: darkTheme ? "#cccccc" : "#333333"
@ -96,8 +100,8 @@ Item {
// General buttons
property color pressedButtonColor: darkTheme ? pressColor : "#a0a0a0"
property color hoveredButtonColor: darkTheme ? hoverColor : "#c7c7c7"
property color hoveredButtonColorWizard: darkTheme ? "#123F4A" : "#E5EEF5"
property color hoveredButtonColor: darkTheme ? "#4d4d4d" : "#dedede"
property color hoveredButtonColorWizard: darkTheme ? "#4d4d4d" : "#dedede"
property color normalButtonColor: darkTheme ? backgroundColor : "#e0e0e0"
property color invertedPressedButtonColor: Qt.rgba(0, 0, 0, 0.5)
@ -209,16 +213,17 @@ Item {
property color chatviewLinkColorDark: "#353637"
property real chatviewFontSize: calcSize(15)
property real chatviewEmojiSize: calcSize(60)
property color timestampColor: darkTheme ? "#bbb" : "#777"
property color timestampColor: darkTheme ? "#515151" : "#E5E5E5"
property color messageReplyColor: darkTheme ? "#bbb" : "#A7A7A7"
property color messageOutTxtColor: "#000000"
property color messageInBgColor: "#e5e5e5"
property color messageInBgColor: darkTheme ? "#303030" : "#dbdbdb"
property color messageOutBgColor: darkTheme ? "#616161" : "#005699"
property color messageInTxtColor: "#FFFFFF"
property color fileOutTimestampColor: darkTheme ? "#eee" : "#555"
property color fileInTimestampColor: darkTheme ? "#999" : "#555"
property color chatviewBgColor: darkTheme ? bgDarkMode_ : whiteColor
property color bgInvitationRectColor: darkTheme ? "#222222" : whiteColor
property color messageBarPlaceholderTextColor: darkTheme ? "#909090" : "#7e7e7e"
property color placeholderTextColor: darkTheme ? "#7a7a7a" : "black" //Qt.rgba(0, 0, 0, 0.2)
property color placeholderTextColorWhite: "#cccccc"
property color inviteHoverColor: darkTheme ? blackColor : whiteColor
@ -229,15 +234,23 @@ Item {
property color previewCardContainerColor: darkTheme ? blackColor : whiteColor
property color previewUrlColor: darkTheme ? "#eeeeee" : "#333"
property color messageWebViewFooterButtonImageColor: darkTheme ? "#838383" : "#656565"
property color chatviewUsernameColor: "#A7A7A7"
property color chatviewSecondaryInformationColor: "#A7A7A7"
// ChatView Footer
property color chatViewFooterListColor: darkTheme ? blackColor : "#E5E5E5"
property color chatViewFooterImgColor: darkTheme ? whiteColor : blackColor
property color showMoreButtonOpenColor: darkTheme ? "#123F4A" : "#CCCCCC"
property color chatViewFooterImgHoverColor: darkTheme ? whiteColor : blackColor
property color chatViewFooterImgColor: darkTheme ? "#909090" : "#7e7e7e"
property color chatViewFooterImgDisableColor: darkTheme ? "#4d4d4d" : "#cbcbcb"
property color showMoreButtonOpenColor: darkTheme ? "#4d4d4d" : "#e5e5e5"
property color chatViewFooterSeparateLineColor: darkTheme ? "#5c5c5c" : "#929292"
property color chatViewFooterSendButtonColor: darkTheme ? "#03B9E9" : "#005699"
property color chatViewFooterSendButtonDisableColor: darkTheme ? "#191a1c" : "#f0f0f1"
property color chatViewFooterSendButtonImgColor: darkTheme ? blackColor : whiteColor
property color chatViewFooterSendButtonImgColorDisable: darkTheme ? "#4d4d4d" : "#cbcbcb"
property color chatViewFooterRectangleBorderColor: darkTheme ? "#4d4d4d" : "#e5e5e5"
// ChatView Header
property real chatViewHeaderButtonRadius: 5
// mapPosition
property color mapButtonsOverlayColor: darkTheme ? "#000000" : "#f0f0f0"
@ -254,12 +267,13 @@ Item {
property real namePopupFontsize: calcSize(15)
property real avatarSize: 30
property int emojiPushButtonSize: 30
property int emojiMargins: 20
property int emojiMargins: 16
property color emojiReactBubbleBgColor: darkTheme ? darkGreyColor : whiteColor
property color emojiReactPushButtonColor: darkTheme ? "#bbb" : "#003b4e"
property real messageOptionTextFontSize: calcSize(15)
property int emojiPickerWidth: 400
property int emojiPickerHeight: 425
property int defaulMaxWidthReaction: 350
// Files To Send Container
property color removeFileButtonColor: Qt.rgba(96, 95, 97, 0.5)
@ -296,12 +310,15 @@ Item {
// Sizes
property real mainViewLeftPaneMinWidth: 300
property real mainViewPaneMinWidth: 430
property real currentLeftPaneWidth: mainViewLeftPaneMinWidth
property real mainViewPaneMinWidth: 490
property real qrCodeImageSize: 256
property real splitViewHandlePreferredWidth: 4
property real indicatorFontSize: calcSize(6)
property real tinyFontSize: calcSize(7 + fontSizeOffset)
property real textFontSize: calcSize(9 + fontSizeOffset)
property real smallFontSize: calcSize(9 + fontSizeOffsetSmall)
property real mediumFontSize: calcSize(10.5 + fontSizeOffset)
property real bigFontSize: calcSize(22)
property real settingsFontSize: calcSize(11 + fontSizeOffset)
property real buttonFontSize: calcSize(9)
@ -314,9 +331,7 @@ Item {
property real tinyCreditsTextSize: calcSize(13 + fontSizeOffset)
property real creditsTextSize: calcSize(15 + fontSizeOffset)
property real primaryRadius: calcSize(4)
property real smartlistItemFontSize: calcSize(10.5 + fontSizeOffset)
property real smartlistItemInfoFontSize: calcSize(9 + fontSizeOffsetSmall)
property real filterItemFontSize: calcSize(smartlistItemFontSize)
property real filterItemFontSize: calcSize(mediumFontSize)
property real filterBadgeFontSize: calcSize(8.25)
property real editedFontSize: calcSize(8)
property real accountListItemHeight: 64
@ -372,6 +387,15 @@ Item {
property real minimumMapWidth: 250
property real pluginHandlersPopupViewHeight: 200
property real pluginHandlersPopupViewDelegateHeight: 50
property color pluginDefaultBackgroundColor: "#666666"
property real remotePluginMinimumDelegateWidth: 430
property real remotePluginMinimumDelegateHeight: 275
property real remotePluginMaximumDelegateWidth: 645
property real remotePluginMaximumDelegateHeight: 413
property real iconMargin: 30 * baseZoom
property real remotePluginDelegateWidth: remotePluginMinimumDelegateWidth * baseZoom
property real remotePluginDelegateHeight: remotePluginMinimumDelegateHeight * baseZoom
property color pluginViewBackgroundColor: darkTheme ? "#000000" : "#F0EFEF"
property real secondaryDialogDimension: 500
property real lineEditContextMenuItemsHeight: 15
@ -384,10 +408,6 @@ Item {
// TimestampInfo
property int timestampLinePadding: 40
property int dayTimestampTopMargin: 8
property int dayTimestampBottomMargin: 8
property int timestampBottomMargin: 16
property int timestampTopMargin: 16
property int dayTimestampHPadding: 16
property real dayTimestampVPadding: 32
property real timestampFont: calcSize(12)
@ -419,7 +439,7 @@ Item {
// Jami Identifier
property color mainColor: "#005699"
property real pushButtonSize: 22
property real pushButtonMargin: 10
property real pushButtonMargins: 10
// Modal Popup
property real modalPopupRadius: 20
@ -434,14 +454,14 @@ Item {
property real chatViewHairLineSize: 1
property real chatViewMaximumWidth: 900
property real chatViewHeaderPreferredHeight: 64
property real chatViewFooterPreferredHeight: 50
property real chatViewFooterMaximumHeight: 280
property real chatViewFooterPreferredHeight: 35
property real chatViewFooterMaximumHeight: 315
property real chatViewFooterRowSpacing: 4
property real chatViewFooterButtonSize: 36
property real chatViewFooterRealButtonSize: 26
property real chatViewFooterButtonIconSize: 48
property real chatViewFooterButtonRadius: 5
property real chatViewFooterTextAreaMaximumHeight: 130
property real chatViewFooterTextAreaMaximumHeight: 260
property real chatViewScrollToBottomButtonBottomMargin: 8
property real usernameBlockFontSize: calcSize(12)
@ -484,13 +504,11 @@ Item {
property real jamiIdMargins: 36
property real jamiIdLogoWidth: 70
property real jamiIdLogoHeight: 24
property real jamiIdFontSize: calcSize(13)
property real jamiIdFontSize: calcSize(19)
property real jamiIdSmallFontSize: calcSize(11)
property color jamiIdColor: darkTheme ? blackColor : sysColor
// MainView
property color welcomeViewBackgroundColor: darkTheme ? lightGrey_ : secondaryBackgroundColor
property real welcomeRectSideMargins: 45
property real welcomeRectTopMargin: 90
property color rectColor: darkTheme ? blackColor : "#e5eef5"
property color welcomeText: darkTheme ? "#0071c9" : "#002B4A"
property real illustrationWidth: 212
@ -518,6 +536,15 @@ Item {
property real welcomeLogoHeight: 100
property real wizardButtonWidth: 400
property real wizardButtonHeightMargin: 31
property color welcomeViewBackgroundColor: darkTheme ? lightGrey_ : secondaryBackgroundColor
property real welcomeRectSideMargins: 45
property real welcomeRectTopMargin: 90
property real welcomePageSpacing: 13
property real welcomeGridWidth: 3 * JamiTheme.tipBoxWidth + 2 * JamiTheme.welcomePageSpacing
property real welcomeHalfGridWidth: (welcomeGridWidth - JamiTheme.welcomePageSpacing) / 2
property real welcomeShortGridWidth: 2 * JamiTheme.tipBoxWidth + JamiTheme.welcomePageSpacing
readonly property string welcomeBg: darkTheme ? JamiResources.bg_darkmode_id_jami_png : JamiResources.bg_lightmode_id_jami_png
property color welcomeBlockColor: darkTheme ? "#4D000000" : "#4DFFFFFF"
// WizardView Advanced Account Settings
property color lightBlue_: darkTheme ? "#03B9E9" : "#e5eef5"
@ -539,6 +566,7 @@ Item {
property real infoBoxDescFontSize: calcSize(12)
// Tipbox
property real tipBoxWidth: 200
property real tipBoxTitleFontSize: calcSize(13)
property real tipBoxContentFontSize: calcSize(12)
property color tipBoxBackgroundColor: darkTheme ? blackColor : whiteColor
@ -582,7 +610,7 @@ Item {
property int keyboardShortcutDelegateSize: 50
// Main application spec
property real mainViewMinWidth: 430
property real mainViewMinWidth: 490
property real mainViewMinHeight: 500
property real wizardViewMinWidth: 500
@ -591,7 +619,7 @@ Item {
property real mainViewPreferredWidth: 730
property real mainViewPreferredHeight: 600
property real mainViewMargin: 30
property real mainViewMargin: 25
// Extras panel
property real extrasPanelMinWidth: 300
@ -609,7 +637,7 @@ Item {
property int settingsDescriptionPixelSize: calcSize(15)
property int settingsCategorySpacing: 15
property int settingsCategoryAudioVideoSpacing: 6
property int settingsBoxRadius: 10
property int settingsBoxRadius: 5
property int settingsBlockSpacing: 40
property int settingsMenuChildrenButtonHeight: 30
property int settingsMenuHeaderButtonHeight: 50
@ -617,7 +645,7 @@ Item {
// MaterialRadioButton
property int radioImageSize: 30
property color radioBackgroundColor: darkTheme ? "#515151" : "#F0EFEF"
property color radioBackgroundColor: darkTheme ? "#303030" : "#F0EFEF"
property color radioBorderColor: darkTheme ? "#03B9E9" : "#005699"
property color lightThemeBackgroundColor: JamiTheme.whiteColor
property color lightThemeCheckedColor: "#005699"

View File

@ -93,6 +93,7 @@ bool
ConversationListProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const
{
QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
auto rx = filterRegularExpression();
auto uriStripper = URI(rx.pattern());
bool stripScheme = (uriStripper.schemeType() < URI::SchemeType::COUNT__);
@ -104,6 +105,11 @@ ConversationListProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex& s
rx.setPattern(uriStripper.format(flags));
using namespace ConversationList;
if (index.data(Role::Uris).toStringList().isEmpty()) {
// TODO: Find out why, and fix in libjami/libjamiclient.
qCritical() << "Filtering 0 member conversation. Fix me";
return false;
}
QStringList toFilter;
toFilter += index.data(Role::Title).toString();

View File

@ -179,7 +179,6 @@ CurrentAccount::updateData()
// SRTP
set_enableSRTP(accConfig.SRTP.enable, true);
set_rtpFallbackSRTP(accConfig.SRTP.rtpFallback, true);
set_keyExchangeSRTP(accConfig.SRTP.keyExchange, true);
// TURN
@ -222,6 +221,9 @@ CurrentAccount::updateData()
set_autoTransferSizeThreshold(settingsManager_->getValue(Settings::Key::AcceptTransferBelow)
.toInt(),
true);
// UI Customization settings
set_uiCustomization(accConfig.uiCustomization, true);
} catch (...) {
qWarning() << "Can't update current account info data for" << id_;
}

View File

@ -160,7 +160,6 @@ class CurrentAccount final : public QObject
// SRTP settings
QML_ACCOUNT_CONFIG_CATEGORY_SETTINGS_PROPERTY(bool, enable, SRTP)
QML_ACCOUNT_CONFIG_CATEGORY_SETTINGS_PROPERTY(bool, rtpFallback, SRTP)
QML_ACCOUNT_CONFIG_CATEGORY_SETTINGS_PROPERTY(lrc::api::account::KeyExchangeProtocol,
keyExchange,
SRTP)
@ -191,6 +190,9 @@ class CurrentAccount final : public QObject
QML_NEW_ACCOUNT_MODEL_SETTINGS_PROPERTY(bool, autoTransferFromTrusted, AutoAcceptFiles)
QML_NEW_ACCOUNT_MODEL_SETTINGS_PROPERTY(int, autoTransferSizeThreshold, AcceptTransferBelow)
// UI Customization settings
QML_ACCOUNT_CONFIG_SETTINGS_PROPERTY(QJsonObject, uiCustomization)
public:
explicit CurrentAccount(LRCInstance* lrcInstance,
AppSettingsManager* settingsManager,

View File

@ -125,6 +125,8 @@ CurrentAccountToMigrate::slotAccountStatusChanged(const QString& accountId)
void
CurrentAccountToMigrate::slotAccountRemoved(const QString& accountId)
{
if (accountToMigrateList_.isEmpty() || accountToMigrateList_.indexOf(accountId) < 0)
return;
if (accountToMigrateList_.removeOne(accountId))
updateData();
if (accountToMigrateList_.isEmpty())

View File

@ -258,9 +258,8 @@ CurrentConversation::updateConversationPreferences(const QString& convId)
color = convInfo.preferences["color"];
}
set_color(color);
if (convInfo.preferences.contains("ignoreNotifications")) {
set_ignoreNotifications(convInfo.preferences["ignoreNotifications"] == "true");
}
set_ignoreNotifications(convInfo.preferences.contains("ignoreNotifications")
&& convInfo.preferences["ignoreNotifications"] == "true");
}
}

View File

@ -39,6 +39,7 @@ public:
doc_ = tidyCreate();
tidyOptSetBool(doc_, TidyQuiet, yes);
tidyOptSetBool(doc_, TidyShowWarnings, no);
tidyOptSetInt(doc_, TidyUseCustomTags, TidyCustomEmpty);
}
~HtmlParser()
@ -51,46 +52,88 @@ public:
return tidyParseString(doc_, html.toLocal8Bit().data()) >= 0;
}
using TagInfoList = QMap<TidyTagId, QList<QString>>;
using TagNodeList = QMap<TidyTagId, QList<TidyNode>>;
// A function that traverses the DOM tree and fills a QVariantMap with a list
// of the tags and their values. The result is structured as follows:
// {tagId1: ["tagValue1", "tagValue2", ...],
// tagId: ["tagValue1", "tagValue2", ...],
// of the tags and their nodes. The result is structured as follows:
// {tagId1: [tagNode1, tagNode2, ...],
// tagId2: [tagNode3, tagNode4, ...],
// ... }
TagInfoList getTags(QList<TidyTagId> tags, int maxDepth = -1)
TagNodeList getTagsNodes(const QList<TidyTagId>& tags, int maxDepth = -1)
{
TagInfoList result;
TagNodeList result;
traverseNode(
tidyGetRoot(doc_),
tags,
[&result](const QString& value, TidyTagId tag) { result[tag].append(value); },
[&result](TidyNode node, TidyTagId tag) { result[tag].append(node); },
maxDepth);
return result;
}
QString getFirstTagValue(TidyTagId tag, int maxDepth = -1)
// The same as the above function, only it returns the first node for a single tag.
TidyNode getFirstTagNode(TidyTagId tag, int maxDepth = -1)
{
QString result;
TidyNode result = nullptr;
traverseNode(
tidyGetRoot(doc_),
{tag},
[&result](const QString& value, TidyTagId) { result = value; },
[&result](TidyNode node, TidyTagId) { result = node; },
maxDepth);
return result;
}
private:
void traverseNode(TidyNode node,
QList<TidyTagId> tags,
const std::function<void(const QString&, TidyTagId)>& cb,
int depth = -1)
// Extract the text value from a node.
QString getNodeText(TidyNode node)
{
TidyBuffer nodeValue = {};
if (!node || tidyNodeGetText(doc_, node, &nodeValue) != yes) {
return QString();
}
QString result = QString::fromUtf8((char*) nodeValue.bp, nodeValue.size);
tidyBufFree(&nodeValue);
return result;
}
// Extract the attribute value from a node.
QString getNodeAttr(TidyNode node, TidyAttrId attrId)
{
TidyAttr attr = tidyAttrGetById(node, attrId);
if (!attr) {
return QString();
}
const auto* attrValue = tidyAttrValue(attr);
if (!attrValue) {
return QString();
}
return QString::fromLocal8Bit(attrValue);
}
// Extract the inner HTML of a node.
QString getNodeInnerHtml(TidyNode node)
{
if (!node) {
return QString();
}
const auto* child = tidyGetChild(node);
return child ? getNodeText(child) : QString();
}
QString getTagInnerHtml(TidyTagId tag)
{
return getNodeInnerHtml(getFirstTagNode(tag));
}
private:
// NOLINTNEXTLINE(misc-no-recursion)
void traverseNode(TidyNode node,
const QList<TidyTagId>& tags,
const std::function<void(TidyNode, TidyTagId)>& cb,
int depth = -1)
{
for (auto tag : tags) {
if (tidyNodeGetId(node) == tag && tidyNodeGetText(doc_, node, &nodeValue) == yes && cb) {
cb(QString::fromLocal8Bit(nodeValue.bp), tag);
if (tidyNodeGetId(node) == tag && cb) {
cb(node, tag);
if (depth != -1 && --depth == 0) {
return;
}

View File

@ -0,0 +1,67 @@
/*
* Copyright (C) 2023 Savoir-faire Linux Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "imagedownloader.h"
#include <QDir>
#include <QLockFile>
ImageDownloader::ImageDownloader(ConnectivityMonitor* cm, QObject* parent)
: NetworkManager(cm, parent)
{}
void
ImageDownloader::downloadImage(const QUrl& url, const QString& localPath)
{
Utils::oneShotConnect(this, &NetworkManager::errorOccurred, this, [this, localPath]() {
onDownloadImageFinished({}, localPath);
});
sendGetRequest(url, [this, localPath](const QByteArray& imageData) {
onDownloadImageFinished(imageData, localPath);
});
}
void
ImageDownloader::onDownloadImageFinished(const QByteArray& data, const QString& localPath)
{
if (data.isEmpty()) {
Q_EMIT downloadImageFailed(localPath);
return;
}
// Make sure the parent folders exists.
const QString dirPath = localPath.left(localPath.lastIndexOf('/'));
const QDir dir;
if (!dir.mkpath(dirPath)) {
qWarning() << Q_FUNC_INFO << "Failed to create directory" << dirPath;
Q_EMIT downloadImageFailed(localPath);
return;
}
QLockFile lf(localPath + ".lock");
QFile file(localPath);
if (lf.lock() && file.open(QIODevice::WriteOnly)) {
file.write(data);
file.close();
Q_EMIT downloadImageSuccessful(localPath);
return;
}
qWarning() << Q_FUNC_INFO << "Failed to write image to" << localPath;
Q_EMIT downloadImageFailed(localPath);
}

42
src/app/imagedownloader.h Normal file
View File

@ -0,0 +1,42 @@
/*
* Copyright (C) 2023 Savoir-faire Linux Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#pragma once
#include "networkmanager.h"
#include "qtutils.h"
class ImageDownloader : public NetworkManager
{
Q_OBJECT
QML_PROPERTY(QString, cachePath)
public:
explicit ImageDownloader(ConnectivityMonitor* cm, QObject* parent = nullptr);
// Download an image and call onDownloadImageFinished when done
Q_INVOKABLE void downloadImage(const QUrl& url, const QString& localPath);
Q_SIGNALS:
void downloadImageSuccessful(const QString& localPath);
void downloadImageFailed(const QString& localPath);
private Q_SLOTS:
// Saves the image to the localPath and emits the appropriate signal
void onDownloadImageFinished(const QByteArray& reply, const QString& localPath);
};

View File

@ -19,6 +19,7 @@
*/
#include "lrcinstance.h"
#include "connectivitymonitor.h"
#include <QBuffer>
#include <QMutex>
@ -31,12 +32,15 @@ LRCInstance::LRCInstance(migrateCallback willMigrateCb,
migrateCallback didMigrateCb,
const QString& updateUrl,
ConnectivityMonitor* connectivityMonitor,
bool muteDring)
: lrc_(std::make_unique<Lrc>(willMigrateCb, didMigrateCb, muteDring))
, updateManager_(std::make_unique<UpdateManager>(updateUrl, connectivityMonitor, this))
bool debugMode,
bool muteDaemon)
: lrc_(std::make_unique<Lrc>(willMigrateCb, didMigrateCb, !debugMode || muteDaemon))
, updateManager_(std::make_unique<AppVersionManager>(updateUrl, connectivityMonitor, this))
, connectivityMonitor_(*connectivityMonitor)
, threadPool_(new QThreadPool(this))
{
debugMode_ = !muteDring;
debugMode_ = debugMode;
muteDaemon_ = muteDaemon;
threadPool_->setMaxThreadCount(1);
connect(this, &LRCInstance::currentAccountIdChanged, [this] {
@ -73,8 +77,8 @@ LRCInstance::LRCInstance(migrateCallback willMigrateCb,
}
};
UpdateManager*
LRCInstance::getUpdateManager()
AppVersionManager*
LRCInstance::getAppVersionManager()
{
return updateManager_.get();
}
@ -109,6 +113,12 @@ LRCInstance::pluginModel()
return lrc_->getPluginModel();
}
ConnectivityMonitor&
LRCInstance::connectivityMonitor()
{
return connectivityMonitor_;
}
bool
LRCInstance::isConnected()
{

View File

@ -24,7 +24,7 @@
#undef ERROR
#endif
#include "updatemanager.h"
#include "appversionmanager.h"
#include "qtutils.h"
#include "utils.h"
@ -65,12 +65,13 @@ public:
migrateCallback didMigrateCb,
const QString& updateUrl,
ConnectivityMonitor* connectivityMonitor,
bool muteDring);
bool debugMode,
bool muteDaemon);
~LRCInstance() = default;
void finish();
UpdateManager* getUpdateManager();
AppVersionManager* getAppVersionManager();
AccountModel& accountModel();
ConversationModel* getCurrentConversationModel();
@ -78,6 +79,7 @@ public:
ContactModel* getCurrentContactModel();
AVModel& avModel();
PluginModel& pluginModel();
ConnectivityMonitor& connectivityMonitor();
BehaviorController& behaviorController();
void subscribeToDebugReceived();
@ -144,7 +146,9 @@ Q_SIGNALS:
private:
std::unique_ptr<Lrc> lrc_;
std::unique_ptr<UpdateManager> updateManager_;
std::unique_ptr<AppVersionManager> updateManager_;
ConnectivityMonitor& connectivityMonitor_;
QString selectedConvUid_;
MapStringString contentDrafts_;
@ -153,6 +157,7 @@ private:
conversation::Info invalid {};
bool debugMode_ {false};
bool muteDaemon_ {true};
QThreadPool* threadPool_;
};

View File

@ -25,7 +25,6 @@
#include "appsettingsmanager.h"
#include "connectivitymonitor.h"
#include "systemtray.h"
#include "previewengine.h"
#include "videoprovider.h"
#include <QAction>
@ -133,7 +132,6 @@ MainApplication::init()
connectivityMonitor_.reset(new ConnectivityMonitor(this));
settingsManager_.reset(new AppSettingsManager(this));
systemTray_.reset(new SystemTray(settingsManager_.get(), this));
previewEngine_.reset(new PreviewEngine(connectivityMonitor_.get(), this));
QObject::connect(settingsManager_.get(),
&AppSettingsManager::retranslate,
@ -149,7 +147,8 @@ MainApplication::init()
initLrc(runOptions_[Option::UpdateUrl].toString(),
connectivityMonitor_.get(),
runOptions_[Option::Debug].toBool() && !runOptions_[Option::MuteJamid].toBool());
runOptions_[Option::Debug].toBool(),
runOptions_[Option::MuteDaemon].toBool());
#if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)
using namespace Interfaces;
@ -227,9 +226,11 @@ MainApplication::handleUriAction(const QString& arg)
}
void
MainApplication::initLrc(const QString& downloadUrl, ConnectivityMonitor* cm, bool logDaemon)
MainApplication::initLrc(const QString& downloadUrl,
ConnectivityMonitor* cm,
bool debugMode,
bool muteDaemon)
{
lrc::api::Lrc::cacheAvatars.store(false);
/*
* Init mainwindow and finish splash when mainwindow shows up.
*/
@ -252,7 +253,8 @@ MainApplication::initLrc(const QString& downloadUrl, ConnectivityMonitor* cm, bo
},
downloadUrl,
cm,
!logDaemon));
debugMode,
muteDaemon));
lrcInstance_->subscribeToDebugReceived();
}
@ -318,7 +320,7 @@ MainApplication::parseArguments()
runOptions_[Option::UpdateUrl] = parser.value(updateUrlOption);
#endif
runOptions_[Option::TerminationRequested] = parser.isSet(terminateOption);
runOptions_[Option::MuteJamid] = parser.isSet(muteDaemonOption);
runOptions_[Option::MuteDaemon] = parser.isSet(muteDaemonOption);
}
void
@ -342,7 +344,7 @@ MainApplication::initQmlLayer()
systemTray_.get(),
lrcInstance_.get(),
settingsManager_.get(),
previewEngine_.get(),
connectivityMonitor_.get(),
&screenInfo_,
this);

View File

@ -20,6 +20,7 @@
#pragma once
#include "imagedownloader.h"
#include "lrcinstance.h"
#include "qtutils.h"
@ -36,7 +37,6 @@ class ConnectivityMonitor;
class AppSettingsManager;
class SystemTray;
class CallAdapter;
class PreviewEngine;
// Provides information about the screen the app is displayed on
class ScreenInfo : public QObject
@ -73,7 +73,7 @@ public:
StartMinimized = 0,
Debug,
UpdateUrl,
MuteJamid,
MuteDaemon,
TerminationRequested,
StartUri
};
@ -99,7 +99,10 @@ Q_SIGNALS:
void searchAndSelect(const QString& request);
private:
void initLrc(const QString& downloadUrl, ConnectivityMonitor* cm, bool logDaemon);
void initLrc(const QString& downloadUrl,
ConnectivityMonitor* cm,
bool debugMode,
bool muteDaemon);
void parseArguments();
void setApplicationFont();
void initQmlLayer();
@ -115,7 +118,7 @@ private:
QScopedPointer<ConnectivityMonitor> connectivityMonitor_;
QScopedPointer<AppSettingsManager> settingsManager_;
QScopedPointer<SystemTray> systemTray_;
QScopedPointer<PreviewEngine> previewEngine_;
QScopedPointer<ImageDownloader> imageDownloader_;
ScreenInfo screenInfo_;
};

View File

@ -43,8 +43,6 @@ Rectangle {
property int tabBarLeftMargin: 8
property int tabButtonShrinkSize: 8
signal loaderSourceChangeRequested(int sourceToLoad)
property string currentConvId: CurrentConversation.id
onCurrentConvIdChanged: {
if (currentConvId !== '') {
@ -149,13 +147,12 @@ Rectangle {
onActivated: layoutManager.toggleWindowFullScreen()
}
Shortcut {
sequence: "Escape"
context: Qt.ApplicationShortcut
onActivated: {
MessagesAdapter.replyToId = ""
MessagesAdapter.editId = ""
layoutManager.popFullScreenItem()
Keys.onPressed: function (keyEvent) {
if (keyEvent.key === Qt.Key_Escape) {
MessagesAdapter.replyToId = "";
MessagesAdapter.editId = "";
layoutManager.popFullScreenItem();
keyEvent.accepted = true;
}
}

View File

@ -26,191 +26,169 @@ import "../../commoncomponents"
BaseModalDialog {
id: root
width: Math.min(parent.width - 2 * JamiTheme.preferredMarginSize, JamiTheme.secondaryDialogDimension)
height: Math.min(parent.height - 2 * JamiTheme.preferredMarginSize, JamiTheme.secondaryDialogDimension)
popupContentMargins: 14
PushButton {
id: btnClose
anchors.right: parent.right
anchors.top: parent.top
anchors.topMargin: JamiTheme.preferredMarginSize
anchors.rightMargin: JamiTheme.preferredMarginSize
imageColor: "grey"
normalColor: JamiTheme.transparentColor
source: JamiResources.round_close_24dp_svg
onClicked: {
close();
}
}
margins: JamiTheme.preferredMarginSize
popupContent: JamiFlickable {
id: aboutPopUpScrollView
id: aboutPopUpScrollView
width: aboutPopUpContentRectColumnLayout.implicitWidth
height: JamiTheme.preferredDialogHeight
width: root.width
contentHeight: aboutPopUpContentRectColumnLayout.implicitHeight
contentHeight: aboutPopUpContentRectColumnLayout.implicitHeight
ColumnLayout {
id: aboutPopUpContentRectColumnLayout
ColumnLayout {
id: aboutPopUpContentRectColumnLayout
anchors.centerIn: parent
width: root.width
ResponsiveImage {
id: aboutPopUPJamiLogoImage
ResponsiveImage {
id: aboutPopUPJamiLogoImage
Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: JamiTheme.aboutLogoPreferredWidth
Layout.preferredHeight: JamiTheme.aboutLogoPreferredHeight
Layout.alignment: Qt.AlignCenter
Layout.topMargin: JamiTheme.preferredMarginSize
Layout.preferredWidth: JamiTheme.aboutLogoPreferredWidth
Layout.preferredHeight: JamiTheme.aboutLogoPreferredHeight
source: JamiTheme.darkTheme ? JamiResources.logo_jami_standard_coul_white_svg : JamiResources.logo_jami_standard_coul_svg
}
TextEdit {
id: jamiSlogansText
Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: aboutPopUpScrollView.width
Layout.topMargin: 26
wrapMode: Text.WordWrap
font.pixelSize: JamiTheme.bigFontSize
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: textMetricsjamiSlogansText.text
selectByMouse: true
readOnly: true
color: JamiTheme.tintedBlue
TextMetrics {
id: textMetricsjamiSlogansText
font: jamiSlogansText.font
text: JamiStrings.slogan
}
}
TextEdit {
id: jamiVersionText
Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: aboutPopUpScrollView.width
font.pixelSize: JamiTheme.tinyCreditsTextSize
padding: 0
text: JamiStrings.version + ": " + UtilsAdapter.getVersionStr()
selectByMouse: true
readOnly: true
color: JamiTheme.textColor
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
TextEdit {
id: jamiDeclarationText
Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: aboutPopUpScrollView.width - JamiTheme.preferredMarginSize * 2
Layout.topMargin: 15
wrapMode: Text.WordWrap
font.pixelSize: JamiTheme.creditsTextSize
color: JamiTheme.textColor
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
// TextMetrics does not work for multi-line.
text: JamiStrings.declaration
selectByMouse: true
readOnly: true
}
TextEdit {
id: jamiDeclarationHyperText
Layout.alignment: Qt.AlignCenter
// Strangely, hoveredLink works badly when width grows too large
Layout.preferredWidth: 50
Layout.topMargin: 15
color: JamiTheme.textColor
font.pixelSize: JamiTheme.creditsTextSize
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: textMetricsjamiDeclarationHyperText.text
textFormat: TextEdit.RichText
selectByMouse: true
readOnly: true
onLinkActivated: Qt.openUrlExternally(link)
TextMetrics {
id: textMetricsjamiDeclarationHyperText
font: jamiDeclarationHyperText.font
text: '<a href="https://jami.net" style="color: ' + JamiTheme.blueLinkColor + '">jami.net</a>'
source: JamiTheme.darkTheme ? JamiResources.logo_jami_standard_coul_white_svg : JamiResources.logo_jami_standard_coul_svg
}
MouseArea {
anchors.fill: parent
TextEdit {
id: jamiSlogansText
// We don't want to eat clicks on the Text.
acceptedButtons: Qt.NoButton
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
}
}
Layout.alignment: Qt.AlignCenter
Layout.maximumWidth: JamiTheme.preferredDialogWidth - 2*JamiTheme.preferredMarginSize
Layout.topMargin: 26
TextEdit {
id: jamiNoneWarrantyHyperText
wrapMode: Text.WordWrap
font.pixelSize: JamiTheme.bigFontSize
Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: Math.min(390, root.width)
Layout.topMargin: 15
wrapMode: Text.WordWrap
font.pixelSize: JamiTheme.tinyCreditsTextSize
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignTop
color: JamiTheme.textColor
text: textMetricsjamiSlogansText.text
selectByMouse: true
readOnly: true
color: JamiTheme.tintedBlue
text: textMetricsjamiNoneWarrantyHyperText.text
textFormat: TextEdit.RichText
selectByMouse: true
readOnly: true
onLinkActivated: Qt.openUrlExternally(link)
TextMetrics {
id: textMetricsjamiNoneWarrantyHyperText
font: jamiDeclarationHyperText.font
text: JamiStrings.declarationYear + " " + '<a href="https://savoirfairelinux.com" style="color: ' + JamiTheme.blueLinkColor + '">Savoir-faire Linux Inc.</a><br>' + 'This program comes with absolutely no warranty. See the <a href="http://www.gnu.org/licenses/gpl-3.0.html" style="color: ' + JamiTheme.blueLinkColor + '">GNU General Public License</a>, version 3 or later for details.'
TextMetrics {
id: textMetricsjamiSlogansText
font: jamiSlogansText.font
text: JamiStrings.slogan
}
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.NoButton
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
}
}
TextEdit {
id: jamiVersionText
ProjectCreditsScrollView {
id: projectCreditsScrollView
Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: aboutPopUpScrollView.width - JamiTheme.preferredMarginSize * 2
Layout.preferredHeight: 100
Layout.topMargin: 25
Layout.margins: JamiTheme.preferredMarginSize
}
Layout.alignment: Qt.AlignCenter
Layout.maximumWidth: JamiTheme.preferredDialogWidth - 2*JamiTheme.preferredMarginSize
font.pixelSize: JamiTheme.tinyCreditsTextSize
padding: 0
text: JamiStrings.version + ": " + UtilsAdapter.getVersionStr()
selectByMouse: true
readOnly: true
color: JamiTheme.textColor
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
TextEdit {
id: jamiDeclarationText
Layout.alignment: Qt.AlignCenter
Layout.maximumWidth: JamiTheme.preferredDialogWidth - 2*JamiTheme.preferredMarginSize
Layout.topMargin: 15
wrapMode: Text.WordWrap
font.pixelSize: JamiTheme.creditsTextSize
color: JamiTheme.textColor
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
// TextMetrics does not work for multi-line.
text: JamiStrings.declaration
selectByMouse: true
readOnly: true
}
TextEdit {
id: jamiDeclarationHyperText
Layout.alignment: Qt.AlignCenter
// Strangely, hoveredLink works badly when width grows too large
Layout.maximumWidth: JamiTheme.preferredDialogWidth - 2*JamiTheme.preferredMarginSize
Layout.topMargin: 15
color: JamiTheme.textColor
font.pixelSize: JamiTheme.creditsTextSize
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: textMetricsjamiDeclarationHyperText.text
textFormat: TextEdit.RichText
selectByMouse: true
readOnly: true
onLinkActivated: Qt.openUrlExternally(link)
TextMetrics {
id: textMetricsjamiDeclarationHyperText
font: jamiDeclarationHyperText.font
text: '<a href="https://jami.net" style="color: ' + JamiTheme.blueLinkColor + '">jami.net</a>'
}
MouseArea {
anchors.fill: parent
// We don't want to eat clicks on the Text.
acceptedButtons: Qt.NoButton
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
}
}
TextEdit {
id: jamiNoneWarrantyHyperText
Layout.alignment: Qt.AlignCenter
Layout.maximumWidth: JamiTheme.preferredDialogWidth - 2*JamiTheme.preferredMarginSize
Layout.topMargin: 15
wrapMode: Text.WordWrap
font.pixelSize: JamiTheme.tinyCreditsTextSize
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignTop
color: JamiTheme.textColor
text: textMetricsjamiNoneWarrantyHyperText.text
textFormat: TextEdit.RichText
selectByMouse: true
readOnly: true
onLinkActivated: Qt.openUrlExternally(link)
TextMetrics {
id: textMetricsjamiNoneWarrantyHyperText
font: jamiDeclarationHyperText.font
text: JamiStrings.declarationYear + " " + '<a href="https://savoirfairelinux.com" style="color: ' + JamiTheme.blueLinkColor + '">Savoir-faire Linux Inc.</a><br>' + 'This program comes with absolutely no warranty. See the <a href="http://www.gnu.org/licenses/gpl-3.0.html" style="color: ' + JamiTheme.blueLinkColor + '">GNU General Public License</a>, version 3 or later for details.'
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.NoButton
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
}
}
ProjectCreditsScrollView {
id: projectCreditsScrollView
Layout.alignment: Qt.AlignCenter
Layout.maximumWidth: JamiTheme.preferredDialogWidth - 2*JamiTheme.preferredMarginSize
Layout.preferredHeight: 100
Layout.topMargin: 25
Layout.margins: JamiTheme.preferredMarginSize
}
}
}
}

View File

@ -181,7 +181,7 @@ Label {
source: !root.popup.opened ? JamiResources.expand_more_24dp_svg : JamiResources.expand_less_24dp_svg
}
PushButton {
JamiPushButton {
id: shareButton
width: visible ? preferredSize : 0
@ -199,7 +199,7 @@ Label {
onClicked: viewCoordinator.presentDialog(appWindow, "mainview/components/WelcomePageQrDialog.qml")
}
PushButton {
JamiPushButton {
id: settingsButton
anchors.verticalCenter: parent.verticalCenter

View File

@ -40,6 +40,9 @@ Popup {
color: JamiTheme.transparentColor
}
focus: true
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
contentItem: ColumnLayout {
spacing: 0

View File

@ -57,20 +57,8 @@ Rectangle {
Layout.leftMargin: 4
Layout.rightMargin: 4
model: ContactAdapter.getContactSelectableModel(type)
Connections {
target: CurrentConversationMembers
function onCountChanged() {
contactPickerListView.model = ContactAdapter.getContactSelectableModel(type);
}
}
onVisibleChanged: {
if (visible)
model = ContactAdapter.getContactSelectableModel(type);
}
// Reset the model if visible or the CurrentConversationMembers.count changes (0 or greater)
model: visible && CurrentConversationMembers.count >= 0 ? ContactAdapter.getContactSelectableModel(type) : null
delegate: ContactPickerItemDelegate {
id: contactPickerItemDelegate

View File

@ -32,6 +32,11 @@ Item {
property var margin: 5
property var prefWidth: 170
property real maxHeight: 250
property color textColor: JamiTheme.textColor
property color iconColor: JamiTheme.tintedBlue
signal ignore
ColumnLayout {
@ -41,6 +46,7 @@ Item {
width: parent.width
RowLayout {
id: rowlayout
Layout.leftMargin: 15
Layout.alignment: Qt.AlignLeft
@ -58,16 +64,16 @@ Item {
containerHeight: Layout.preferredHeight
containerWidth: Layout.preferredWidth
source: JamiResources.noun_paint_svg
color: JamiTheme.buttonTintedBlue
source: JamiResources.backup_svg
color: root.iconColor
}
Text {
id: title
text: JamiStrings.backupAccountBtn
color: JamiTheme.textColor
color: root.textColor
font.weight: Font.Medium
Layout.topMargin: root.margin
visible: !opened
Layout.alignment: Qt.AlignLeft
Layout.leftMargin: root.margin
Layout.preferredWidth: root.prefWidth - 2 * root.margin - root.iconSize
@ -81,69 +87,60 @@ Item {
Layout.preferredWidth: root.prefWidth
Layout.leftMargin: 20
Layout.topMargin: 8
Layout.bottomMargin: 15
Layout.bottomMargin: 8
font.pixelSize: JamiTheme.tipBoxContentFontSize
visible: !opened
wrapMode: Text.WordWrap
font.weight: Font.Normal
text: JamiStrings.whyBackupAccount
color: JamiTheme.textColor
color: root.textColor
horizontalAlignment: Text.AlignLeft
}
Text {
JamiFlickable {
Layout.preferredWidth: root.width - 32
Layout.leftMargin: 20
Layout.topMargin: 20
font.pixelSize: JamiTheme.tipBoxContentFontSize
visible: opened
wrapMode: Text.WordWrap
text: JamiStrings.backupAccountInfos
color: JamiTheme.textColor
horizontalAlignment: Text.AlignLeft
}
property real maxDescriptionHeight: maxHeight - rowlayout.Layout.preferredHeight - title.Layout.preferredHeight - 3 * JamiTheme.preferredMarginSize
Layout.preferredHeight: opened ? Math.min(contentHeight, maxDescriptionHeight) : 0
contentHeight: description.height
Text {
id: description
width: parent.width
font.pixelSize: JamiTheme.tipBoxContentFontSize
visible: opened
wrapMode: Text.WordWrap
text: JamiStrings.backupAccountInfos
color: root.textColor
horizontalAlignment: Text.AlignLeft
linkColor: JamiTheme.buttonTintedBlue
MaterialButton {
id: backupBtn
Layout.alignment: Qt.AlignCenter
preferredWidth: parent.width - 32
height: 32
visible: opened
text: JamiStrings.backupAccountBtn
autoAccelerator: true
color: JamiTheme.buttonTintedGrey
hoveredColor: JamiTheme.buttonTintedGreyHovered
pressedColor: JamiTheme.buttonTintedGreyPressed
onClicked: {
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/JamiFileDialog.qml", {
"title": JamiStrings.backupAccountHere,
"fileMode": JamiFileDialog.SaveFile,
"folder": StandardPaths.writableLocation(StandardPaths.HomeLocation) + "/Desktop",
"nameFilters": [JamiStrings.jamiArchiveFiles, JamiStrings.allFiles]
});
dlg.fileAccepted.connect(function (file) {
// Is there password? If so, go to password dialog, else, go to following directly
if (CurrentAccount.hasArchivePassword) {
var pwdDlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/PasswordDialog.qml", {
"path": UtilsAdapter.getAbsPath(file),
"purpose": PasswordDialog.ExportAccount
});
pwdDlg.done.connect(function () {
onLinkActivated: {
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/JamiFileDialog.qml", {
"title": JamiStrings.backupAccountHere,
"fileMode": JamiFileDialog.SaveFile,
"folder": StandardPaths.writableLocation(StandardPaths.HomeLocation) + "/Desktop",
"nameFilters": [JamiStrings.jamiArchiveFiles, JamiStrings.allFiles]
});
dlg.fileAccepted.connect(function (file) {
// Is there password? If so, go to password dialog, else, go to following directly
if (CurrentAccount.hasArchivePassword) {
var pwdDlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/PasswordDialog.qml", {
"path": UtilsAdapter.getAbsPath(file),
"purpose": PasswordDialog.ExportAccount
});
pwdDlg.done.connect(function () {
root.ignore();
});
} else {
if (file.toString().length > 0) {
root.ignore();
});
} else {
if (file.toString().length > 0) {
root.ignore();
}
}
}
});
dlg.rejected.connect(function () {
backupBtn.forceActiveFocus();
});
});
dlg.rejected.connect(function () {
backupBtn.forceActiveFocus();
});
}
}
}
}

View File

@ -0,0 +1,94 @@
/*
* Copyright (C) 2023 Savoir-faire Linux Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import net.jami.Adapters 1.1
import net.jami.Constants 1.1
import net.jami.Helpers 1.1
import net.jami.Models 1.1
import "../../commoncomponents"
Item {
id: cachedImage
property bool customLogo: false
property alias source: image.source
property string defaultImage: ""
property string downloadUrl: ""
property alias imageLayer: image.layer
property string fileExtension: downloadUrl.substring(downloadUrl.lastIndexOf("."), downloadUrl.length)
property string localPath: ""
property int imageFillMode: 0
property alias image: image
AnimatedImage {
id: image
objectName: "image"
anchors.fill: parent
fillMode: imageFillMode
smooth: true
antialiasing: true
property bool isGif: {
// True only for local gifs.
UtilsAdapter.getMimeNameForUrl(source).startsWith("image/gif");
}
source: defaultImage
onStatusChanged: {
if (status === Image.Error) {
source = defaultImage;
}
}
}
Connections {
target: ImageDownloader
function onDownloadImageSuccessful(localPath) {
if (localPath === cachedImage.localPath) {
image.source = UtilsAdapter.urlFromLocalPath(localPath);
}
}
}
Connections {
target: cachedImage
function onDownloadUrlChanged() {
updateImageSource(downloadUrl, localPath, defaultImage);
}
}
Component.onCompleted: {
updateImageSource(downloadUrl, localPath, defaultImage);
}
function updateImageSource(downloadUrl, localPath, defaultImage) {
if (downloadUrl === "") {
image.source = defaultImage;
return;
}
if (downloadUrl && downloadUrl !== "" && localPath !== "") {
if (!UtilsAdapter.fileExists(localPath)) {
ImageDownloader.downloadImage(downloadUrl, localPath);
} else {
image.source = UtilsAdapter.urlFromLocalPath(localPath);
if (image.isGif) {
image.playing = true;
}
}
}
}
}

View File

@ -420,7 +420,7 @@ Control {
icon.source: JamiResources.plugins_24dp_svg
icon.color: "white"
text: JamiStrings.viewPlugin
enabled: PluginAdapter.isEnabled && PluginAdapter.callMediaHandlersListCount
enabled: PluginAdapter.callMediaHandlersListCount
onEnabledChanged: CallOverlayModel.setEnabled(this, pluginsAction.enabled)
},
Action {
@ -490,7 +490,7 @@ Control {
interactive: false
model: SortFilterProxyModel {
sourceModel: CallOverlayModel.primaryModel()
sourceModel: root.visible ? CallOverlayModel.primaryModel() : null
filters: ValueFilter {
roleName: "Enabled"
value: true
@ -542,7 +542,7 @@ Control {
CallOverlayModel.overflowIndex = effectiveOverflowIndex;
}
model: CallOverlayModel.overflowModel()
model: root.visible ? CallOverlayModel.overflowModel() : null
delegate: buttonDelegate
}
@ -553,7 +553,7 @@ Control {
width: root.height
height: width
model: CallOverlayModel.overflowHiddenModel()
model: root.visible ? CallOverlayModel.overflowHiddenModel() : null
delegate: buttonDelegate

View File

@ -99,6 +99,9 @@ Rectangle {
ChatViewHeader {
id: chatViewHeader
addParticipantOpened: extrasPanel.currentIndex === ChatView.AddMemberPanel
swarmDetailsOpened: extrasPanel.currentIndex === ChatView.SwarmDetailsPanel
Layout.alignment: Qt.AlignHCenter
Layout.fillWidth: true
Layout.preferredHeight: JamiTheme.chatViewHeaderPreferredHeight
@ -166,12 +169,6 @@ Rectangle {
}
}
GenericErrorsRow {
id: genericError
Layout.fillWidth: true
Layout.preferredHeight: JamiTheme.chatViewHeaderPreferredHeight
}
ConversationErrorsRow {
id: errorRect
Layout.fillWidth: true
@ -260,6 +257,7 @@ Rectangle {
currentIndex: CurrentConversation.isRequest || CurrentConversation.needsSyncing
Loader {
id: loader
active: CurrentConversation.id !== ""
sourceComponent: MessageListView {
DropArea {
@ -299,6 +297,12 @@ Rectangle {
return CurrentConversation.isSwarm || CurrentConversation.isTemporary;
}
onHeightChanged: {
if (loader.item != null) {
Qt.callLater(loader.item.scrollToBottom);
}
}
Layout.alignment: Qt.AlignHCenter
Layout.fillWidth: true
Layout.preferredHeight: implicitHeight

View File

@ -25,10 +25,10 @@ import "../../commoncomponents"
Rectangle {
id: root
property alias textInput: messageBar.textAreaObj
property string previousConvId
property string previousAccountId
property bool showTypo: messageBar.showTypo
function setFilePathsToSend(filePaths) {
for (var index = 0; index < filePaths.length; ++index) {
@ -79,6 +79,8 @@ Rectangle {
var editedMessageBody = MessagesAdapter.dataForInteraction(MessagesAdapter.editId, MessageList.Body);
messageBar.textAreaObj.insertText(editedMessageBody);
messageBar.textAreaObj.forceActiveFocus();
} else {
messageBar.textAreaObj.clearText();
}
}
@ -96,7 +98,6 @@ Rectangle {
ColumnLayout {
id: footerColumnLayout
anchors.centerIn: root
width: root.width
@ -116,7 +117,6 @@ Rectangle {
EditContainer {
id: editContainer
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: footerColumnLayout.width
Layout.maximumWidth: JamiTheme.chatViewMaximumWidth
@ -130,6 +130,11 @@ Rectangle {
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: footerColumnLayout.width
Layout.leftMargin: marginSize
Layout.rightMargin: marginSize
Layout.bottomMargin: marginSize
Layout.preferredHeight: height
property var emojiPicker
Connections {
@ -156,11 +161,7 @@ Rectangle {
}
function setXposition() {
if (UtilsAdapter.isRTL) {
return messageBar.width - JamiTheme.emojiPickerWidth;
} else {
return 0;
}
return messageBar.width - JamiTheme.emojiPickerWidth;
}
function setYposition() {
@ -170,7 +171,11 @@ Rectangle {
sendButtonVisibility: text || dataTransferSendContainer.filesToSendCount
onEmojiButtonClicked: {
openEmojiPicker();
if (emojiPicker != null && emojiPicker.opened) {
emojiPicker.closeEmojiPicker();
} else {
openEmojiPicker();
}
}
onShowMapClicked: {
@ -217,6 +222,16 @@ Rectangle {
messageBar.textAreaObj.clearText();
MessagesAdapter.replyToId = "";
}
Keys.onShortcutOverride: function (keyEvent) {
if (keyEvent.key === Qt.Key_Escape) {
if (recordBox != null && recordBox.opened) {
recordBox.closeRecorder();
} else if (PositionManager.isMapActive(CurrentAccount.id)) {
PositionManager.setMapInactive(CurrentAccount.id);
}
}
}
}
FilesToSendContainer {

View File

@ -60,6 +60,9 @@ Rectangle {
return true;
}
property bool addParticipantOpened: false
property bool swarmDetailsOpened: false
property bool addMemberVisibility: {
return swarmDetailsVisibility && !CurrentConversation.isCoreDialog && !CurrentConversation.isRequest;
}
@ -77,7 +80,7 @@ Rectangle {
anchors.rightMargin: 8
spacing: 16
PushButton {
JamiPushButton {
id: backToWelcomeViewButton
Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
@ -90,9 +93,6 @@ Rectangle {
source: JamiResources.back_24dp_svg
toolTipText: CurrentConversation.inCall ? JamiStrings.backCall : JamiStrings.hideChat
normalColor: JamiTheme.chatviewBgColor
imageColor: JamiTheme.chatviewButtonColor
onClicked: root.backClicked()
}
@ -158,6 +158,8 @@ Rectangle {
Layout.preferredWidth: 40 + (isOpen? JamiTheme.searchbarSize : 0)
colorSearchBar: JamiTheme.backgroundColor
hoverButtonRadius: JamiTheme.chatViewHeaderButtonRadius
Behavior on Layout.preferredWidth {
NumberAnimation {
duration: 150
@ -184,88 +186,67 @@ Rectangle {
}
}
PushButton {
JamiPushButton {
id: startAAudioCallButton
visible: interactionButtonsVisibility && (!addMemberVisibility || UtilsAdapter.getAppValue(Settings.EnableExperimentalSwarm))
source: JamiResources.place_audiocall_24dp_svg
toolTipText: JamiStrings.placeAudioCall
normalColor: JamiTheme.chatviewBgColor
imageColor: JamiTheme.chatviewButtonColor
onClicked: CallAdapter.placeAudioOnlyCall()
}
PushButton {
JamiPushButton {
id: startAVideoCallButton
visible: CurrentAccount.videoEnabled_Video && interactionButtonsVisibility && (!addMemberVisibility || UtilsAdapter.getAppValue(Settings.EnableExperimentalSwarm))
source: JamiResources.videocam_24dp_svg
toolTipText: JamiStrings.placeVideoCall
normalColor: JamiTheme.chatviewBgColor
imageColor: JamiTheme.chatviewButtonColor
onClicked: {
CallAdapter.placeCall();
}
onClicked: CallAdapter.placeCall()
}
PushButton {
JamiPushButton {
id: addParticipantsButton
checkable: true
checked: root.addParticipantOpened
visible: interactionButtonsVisibility && addMemberVisibility
source: JamiResources.add_people_24dp_svg
toolTipText: JamiStrings.addParticipants
normalColor: JamiTheme.chatviewBgColor
imageColor: JamiTheme.chatviewButtonColor
visible: interactionButtonsVisibility && addMemberVisibility
onClicked: addToConversationClicked()
}
PushButton {
JamiPushButton {
id: selectPluginButton
visible: PluginAdapter.isEnabled && PluginAdapter.chatHandlersListCount && interactionButtonsVisibility
visible: PluginAdapter.chatHandlersListCount && interactionButtonsVisibility
source: JamiResources.plugins_24dp_svg
toolTipText: JamiStrings.showPlugins
normalColor: JamiTheme.chatviewBgColor
imageColor: JamiTheme.chatviewButtonColor
onClicked: pluginSelector()
}
PushButton {
JamiPushButton {
id: sendContactRequestButton
visible: CurrentConversation.isTemporary || CurrentConversation.isBanned
source: JamiResources.add_people_24dp_svg
toolTipText: JamiStrings.addToConversations
normalColor: JamiTheme.chatviewBgColor
imageColor: JamiTheme.chatviewButtonColor
onClicked: CurrentConversation.isBanned ? MessagesAdapter.unbanConversation(CurrentConversation.id) : MessagesAdapter.sendConversationRequest()
}
PushButton {
JamiPushButton {
id: detailsButton
checkable: true
checked: root.swarmDetailsOpened
visible: interactionButtonsVisibility && (swarmDetailsVisibility || LRCInstance.currentAccountType === Profile.Type.SIP) // TODO if SIP not a request
source: JamiResources.swarm_details_panel_svg
toolTipText: JamiStrings.details
normalColor: JamiTheme.chatviewBgColor
imageColor: JamiTheme.chatviewButtonColor
onClicked: showDetailsClicked()
}
}

View File

@ -23,113 +23,59 @@ import net.jami.Models 1.1
import net.jami.Constants 1.1
import "../../commoncomponents"
Popup {
BaseModalDialog {
id: contactPickerPopup
property int type: ContactList.CONFERENCE
contentWidth: 250
contentHeight: contactPickerPopupRectColumnLayout.height + 50
title: {
switch (type) {
case ContactList.CONFERENCE:
return JamiStrings.addToConference;
case ContactList.ADDCONVMEMBER:
return JamiStrings.addToConversation;
case ContactList.TRANSFER:
return JamiStrings.transferThisCall;
default:
return JamiStrings.addDefaultModerator;
}
}
padding: 0
popupContent: ColumnLayout {
id: contactPickerPopupRectColumnLayout
anchors.centerIn: parent
width: 400
modal: true
Searchbar {
id: contactPickerContactSearchBar
contentItem: Rectangle {
id: contactPickerPopupRect
width: 250
Layout.alignment: Qt.AlignCenter
Layout.margins: 5
Layout.fillWidth: true
Layout.preferredHeight: 35
PushButton {
id: closeButton
placeHolderText: type === ContactList.TRANSFER ? JamiStrings.transferTo : JamiStrings.addParticipant
anchors.top: contactPickerPopupRect.top
anchors.topMargin: 5
anchors.right: contactPickerPopupRect.right
anchors.rightMargin: 5
imageColor: JamiTheme.textColor
source: JamiResources.round_close_24dp_svg
onClicked: {
contactPickerPopup.close();
onSearchBarTextChanged: function(text){
ContactAdapter.setSearchFilter(text);
}
}
ColumnLayout {
id: contactPickerPopupRectColumnLayout
JamiListView {
id: contactPickerListView
anchors.top: contactPickerPopupRect.top
anchors.topMargin: 15
Layout.alignment: Qt.AlignCenter
Layout.fillWidth: true
Layout.preferredHeight: 180
Layout.bottomMargin: JamiTheme.preferredMarginSize
Text {
id: contactPickerTitle
model: ContactAdapter.getContactSelectableModel(type)
Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: contactPickerPopupRect.width
Layout.preferredHeight: 30
delegate: ContactPickerItemDelegate {
id: contactPickerItemDelegate
font.pointSize: JamiTheme.textFontSize
font.bold: true
color: JamiTheme.textColor
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: {
switch (type) {
case ContactList.CONFERENCE:
return JamiStrings.addToConference;
case ContactList.ADDCONVMEMBER:
return JamiStrings.addToConversation;
case ContactList.TRANSFER:
return JamiStrings.transferThisCall;
default:
return JamiStrings.addDefaultModerator;
}
}
}
Searchbar {
id: contactPickerContactSearchBar
Layout.alignment: Qt.AlignCenter
Layout.margins: 5
Layout.fillWidth: true
Layout.preferredHeight: 35
placeHolderText: type === ContactList.TRANSFER ? JamiStrings.transferTo : JamiStrings.addParticipant
onSearchBarTextChanged: function(text){
ContactAdapter.setSearchFilter(text);
}
}
JamiListView {
id: contactPickerListView
Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: contactPickerPopupRect.width
Layout.preferredHeight: 200
model: ContactAdapter.getContactSelectableModel(type)
delegate: ContactPickerItemDelegate {
id: contactPickerItemDelegate
showPresenceIndicator: type !== ContactList.TRANSFER
}
showPresenceIndicator: type !== ContactList.TRANSFER
}
}
radius: 10
color: JamiTheme.backgroundColor
}
onAboutToShow: {
contactPickerListView.model = ContactAdapter.getContactSelectableModel(type);
}
background: Rectangle {
color: "transparent"
}
}

View File

@ -35,9 +35,9 @@ JamiListView {
}
currentIndex: model.currentFilteredRow
// highlight selection
// down and hover states are done within the delegate
highlightMoveDuration: 60
// Disable highlight on current item; we do this ourselves with the
// SmartListItemDelegate.
highlightFollowsCurrentItem: false
headerPositioning: ListView.OverlayHeader
header: Rectangle {
@ -53,7 +53,7 @@ JamiListView {
verticalCenter: parent.verticalCenter
}
text: headerLabel + " (" + root.count + ")"
font.pointSize: JamiTheme.smartlistItemFontSize
font.pointSize: JamiTheme.mediumFontSize
font.weight: Font.DemiBold
color: JamiTheme.textColor
}

View File

@ -30,7 +30,7 @@ ContextMenuAutoLoader {
property string responsibleAccountId: ""
property string responsibleConvUid: ""
property bool isBanned: false
property var isCoreDialog: undefined
property bool isCoreDialog: false
property var mode: undefined
property int contactType: Profile.Type.INVALID
property bool hasCall: false
@ -91,7 +91,7 @@ ContextMenuAutoLoader {
"confirmLabel": JamiStrings.optionRemove
});
dlg.accepted.connect(function () {
if (!isCoreDialog)
if (mode !== Conversation.Mode.NON_SWARM)
MessagesAdapter.removeConversation(responsibleConvUid);
else
MessagesAdapter.removeContact(responsibleConvUid);
@ -126,8 +126,8 @@ ContextMenuAutoLoader {
GeneralMenuItem {
id: blockContact
canTrigger: !hasCall && contactType !== Profile.Type.SIP && !root.isBanned
itemName: !(mode && isCoreDialog) ? JamiStrings.blockContact : JamiStrings.blockSwarm
canTrigger: !hasCall && contactType !== Profile.Type.SIP && !root.isBanned && isCoreDialog && root.idText !== CurrentAccount.uri
itemName: JamiStrings.blockContact
iconSource: JamiResources.block_black_24dp_svg
addMenuSeparatorAfter: canTrigger
onClicked: {

View File

@ -29,6 +29,17 @@ ColumnLayout {
property var iconSize: 26
property var margin: 5
property var prefWidth: 170
property bool opened: root.opened
property color textColor: JamiTheme.textColor
property color iconColor: JamiTheme.tintedBlue
focus: true
onOpenedChanged: {
if (opened)
displayNameLineEdit.forceActiveFocus();
}
RowLayout {
@ -49,16 +60,16 @@ ColumnLayout {
containerWidth: Layout.preferredWidth
source: JamiResources.noun_paint_svg
color: JamiTheme.buttonTintedBlue
color: column.iconColor
focus: activeFocus
}
Label {
text: JamiStrings.customize
color: JamiTheme.textColor
color: column.textColor
font.weight: Font.Medium
Layout.topMargin: column.margin
Layout.preferredWidth: column.prefWidth - 2 * column.margin - column.iconSize
visible: !opened
Layout.alignment: Qt.AlignLeft
Layout.leftMargin: column.margin
horizontalAlignment: Text.AlignLeft
@ -78,7 +89,7 @@ ColumnLayout {
wrapMode: Text.WordWrap
font.weight: Font.Normal
text: JamiStrings.customizeText
color: JamiTheme.textColor
color: column.textColor
}
PhotoboothView {
@ -106,17 +117,18 @@ ColumnLayout {
placeholderText: JamiStrings.enterNickname
onAccepted: AccountAdapter.setCurrAccDisplayName(dynamicText)
focus: activeFocus
}
Text {
Layout.preferredWidth: root.width - 32
Layout.leftMargin: 20
Layout.topMargin: 6
Layout.topMargin: 15
font.pixelSize: JamiTheme.tipBoxContentFontSize
visible: opened
wrapMode: Text.WordWrap
text: JamiStrings.customizationDescription2
color: JamiTheme.textColor
text: JamiStrings.customizationDescription
color: column.textColor
}
}

View File

@ -27,44 +27,26 @@ import "../../commoncomponents"
BaseModalDialog {
id: root
width: 488
height: 320
width: JamiTheme.secondaryDialogDimension
popupContent: Rectangle {
id: rect
title: JamiStrings.defaultCallHost
color: JamiTheme.transparentColor
width: root.width
PushButton {
id: btnCancel
imageColor: "grey"
normalColor: "transparent"
anchors.right: parent.right
anchors.top: parent.top
anchors.topMargin: 10
anchors.rightMargin: 10
source: JamiResources.round_close_24dp_svg
onClicked: {
close();
}
}
ColumnLayout {
popupContent: ColumnLayout {
id: mainLayout
anchors.fill: parent
anchors.centerIn: parent
anchors.margins: JamiTheme.preferredMarginSize
spacing: JamiTheme.preferredMarginSize
Label {
id: informativeLabel
Layout.alignment: Qt.AlignCenter
Layout.fillWidth: true
Layout.topMargin: 26
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
Layout.topMargin: JamiTheme.preferredMarginSize
Layout.preferredWidth: root.width - 4*JamiTheme.preferredMarginSize
wrapMode: Text.Wrap
text: JamiStrings.chooseHoster
color: JamiTheme.primaryForegroundColor
}
@ -97,7 +79,7 @@ BaseModalDialog {
property bool isCurrent: DeviceName
implicitWidth: devicesListView.width
width: devicesListView.width
width: root.width - 4*JamiTheme.preferredMarginSize
height: 70
highlighted: ListView.isCurrentItem
@ -136,7 +118,6 @@ BaseModalDialog {
ColumnLayout {
id: deviceInfoColumnLayout
Layout.fillWidth: true
Layout.fillHeight: true
Layout.leftMargin: JamiTheme.preferredMarginSize
@ -144,7 +125,6 @@ BaseModalDialog {
id: labelDeviceName
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
Layout.fillWidth: true
elide: Text.ElideRight
color: JamiTheme.textColor
@ -155,11 +135,11 @@ BaseModalDialog {
id: labelDeviceId
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
Layout.fillWidth: true
Layout.preferredWidth: root.width - 200
elide: Text.ElideRight
color: JamiTheme.textColor
text: deviceId === "" ? qsTr("Device Id") : deviceId
text: deviceId === "" ? JamiStrings.deviceId : deviceId
}
}
}
@ -175,9 +155,10 @@ BaseModalDialog {
}
}
RowLayout {
ColumnLayout {
id: buttonLayout
spacing: JamiTheme.preferredMarginSize
Layout.preferredWidth: parent.width
Layout.preferredWidth: root.width - 240
MaterialButton {
id: chooseBtn
@ -192,8 +173,8 @@ BaseModalDialog {
Layout.alignment: Qt.AlignCenter
Layout.fillWidth: true
primary: true
preferredWidth: chooseBtnTextSize.width + 2 * JamiTheme.buttontextWizzardPadding
enabled: devicesListView.currentItem
text: JamiStrings.chooseThisDevice
@ -220,7 +201,6 @@ BaseModalDialog {
Layout.alignment: Qt.AlignCenter
Layout.fillWidth: true
primary: true
preferredWidth: rmDeviceBtnTextSize.width + 2 * JamiTheme.buttontextWizzardPadding
enabled: devicesListView.currentItem
text: JamiStrings.removeCurrentDevice
@ -235,4 +215,4 @@ BaseModalDialog {
}
}
}
}

View File

@ -31,7 +31,11 @@ Rectangle {
property alias text: errorLabel.text
color: JamiTheme.filterBadgeColor
visible: CurrentAccount.status === Account.Status.UNREGISTERED
visible: CurrentAccount.id !== ""
&& CurrentAccount.status !== Account.Status.REGISTERED
&& CurrentAccount.status !== Account.Status.READY
&& CurrentAccount.status !== Account.Status.TRYING
&& CurrentAccount.status !== Account.Status.INITIALIZING
RowLayout {
anchors.fill: parent
@ -41,7 +45,6 @@ Rectangle {
id: errorLabel
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
text: CurrentAccount.enabled ? JamiStrings.noNetworkConnectivity : JamiStrings.disabledAccount
color: JamiTheme.filterBadgeTextColor
font.pixelSize: JamiTheme.headerFontSize
elide: Text.ElideRight

View File

@ -26,45 +26,21 @@ import "../../commoncomponents"
BaseModalDialog {
id: root
width: 488
height: 256
property bool isAdmin: {
var role = UtilsAdapter.getParticipantRole(CurrentAccount.id, CurrentConversation.id, CurrentAccount.uri);
return role === Member.Role.ADMIN;
}
popupContent: Rectangle {
id: rect
color: JamiTheme.transparentColor
width: root.width
PushButton {
id: btnCancel
imageColor: "grey"
normalColor: "transparent"
anchors.right: parent.right
anchors.top: parent.top
anchors.topMargin: 10
anchors.rightMargin: 10
source: JamiResources.round_close_24dp_svg
onClicked: {
close();
}
}
ColumnLayout {
popupContent: ColumnLayout {
id: mainLayout
anchors.fill: parent
anchors.margins: JamiTheme.preferredMarginSize
spacing: JamiTheme.preferredMarginSize
Label {
id: informativeLabel
Layout.alignment: Qt.AlignCenter
Layout.fillWidth: true
Layout.topMargin: 26
Layout.maximumWidth: root.parent.width - 4*JamiTheme.preferredMarginSize
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
@ -77,7 +53,7 @@ BaseModalDialog {
Layout.alignment: Qt.AlignCenter
Layout.topMargin: 26
Layout.margins: JamiTheme.preferredMarginSize
text: isAdmin ? JamiStrings.becomeHostOneCall : JamiStrings.hostThisCall
onClicked: {
@ -90,6 +66,7 @@ BaseModalDialog {
id: becomeDefaultHostBtn
Layout.alignment: Qt.AlignCenter
Layout.margins: JamiTheme.preferredMarginSize
text: JamiStrings.becomeDefaultHost
toolTipText: JamiStrings.becomeDefaultHost
@ -105,4 +82,4 @@ BaseModalDialog {
}
}
}
}
//}

View File

@ -26,12 +26,18 @@ ColumnLayout {
id: column
width: parent.width
property real maxHeight: 250
property var iconSize: 26
property var margin: 5
property var prefWidth: 170
RowLayout {
property color textColor: JamiTheme.textColor
property color iconColor: JamiTheme.tintedBlue
RowLayout {
id: rowlayout
Layout.preferredHeight: opened ? 0 : childrenRect.height
Layout.leftMargin: 15
Layout.alignment: Qt.AlignLeft
@ -49,12 +55,12 @@ ColumnLayout {
containerWidth: Layout.preferredWidth
source: JamiResources.glasses_tips_svg
color: JamiTheme.buttonTintedBlue
color: column.iconColor
}
Label {
text: JamiStrings.tip
color: JamiTheme.textColor
color: column.textColor
font.weight: Font.Medium
Layout.topMargin: column.margin
visible: !opened
@ -68,26 +74,35 @@ ColumnLayout {
}
Text {
id: title
Layout.preferredHeight: contentHeight
Layout.preferredWidth: opened ? 140 : 150
Layout.leftMargin: 20
Layout.topMargin: opened ? 0 : 8
Layout.bottomMargin: 15
Layout.bottomMargin: 8
font.pixelSize: JamiTheme.tipBoxContentFontSize
wrapMode: Text.WordWrap
font.weight: opened ? Font.Medium : Font.Normal
text: root.title
horizontalAlignment: Text.AlignLeft
color: JamiTheme.textColor
color: column.textColor
}
Text {
JamiFlickable {
Layout.preferredWidth: root.width - 32
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
font.pixelSize: JamiTheme.tipBoxContentFontSize
visible: opened
wrapMode: Text.WordWrap
text: root.description
horizontalAlignment: Text.AlignLeft
color: JamiTheme.textColor
property real maxDescriptionHeight: maxHeight - rowlayout.Layout.preferredHeight - title.Layout.preferredHeight - 2 * JamiTheme.preferredMarginSize
Layout.preferredHeight: opened ? Math.min(contentHeight, maxDescriptionHeight) : 0
contentHeight: description.height
Text {
id: description
width: parent.width
font.pixelSize: JamiTheme.tipBoxContentFontSize
visible: opened
wrapMode: Text.WordWrap
text: root.description
horizontalAlignment: Text.AlignLeft
color: column.textColor
}
}
}

View File

@ -169,7 +169,7 @@ Rectangle {
Layout.preferredWidth: root.width
Layout.topMargin: 8
font.pointSize: JamiTheme.smartlistItemFontSize
font.pointSize: JamiTheme.mediumFontSize
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
@ -238,7 +238,7 @@ Rectangle {
Layout.preferredWidth: JamiTheme.callButtonPreferredSize
Layout.preferredHeight: JamiTheme.preferredFieldHeight
font.pointSize: JamiTheme.smartlistItemInfoFontSize
font.pointSize: JamiTheme.smallFontSize
font.kerning: true
color: actionButton.hovered ? JamiTheme.whiteColor : JamiTheme.whiteColorTransparent

View File

@ -0,0 +1,28 @@
/*
* Copyright (C) 2022-2023 Savoir-faire Linux Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick
import net.jami.Constants 1.1
import "../../commoncomponents"
PushButton {
pressedColor: JamiTheme.pressedButtonColor
hoveredColor: JamiTheme.hoveredButtonColor
radius: JamiTheme.chatViewHeaderButtonRadius
normalColor: JamiTheme.chatviewBgColor
imageColor: hovered ? JamiTheme.chatviewButtonColor : JamiTheme.chatViewFooterImgColor
}

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