1
0
Fork 0
mirror of https://git.jami.net/savoirfairelinux/jami-client-qt.git synced 2025-03-28 14:56:19 +01:00

ChatViewFooter: apply the new design

GitLab: #1067

Change-Id: Ia80f85c678cb202d8e91cb3efe83d9ea82c40ae6
This commit is contained in:
Franck LAURENT 2023-04-12 17:20:16 -04:00 committed by Sébastien Blin
parent a5755bbdb8
commit c43978cb12
21 changed files with 1074 additions and 195 deletions

View file

@ -0,0 +1,16 @@
<?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">
<style type="text/css">
.st0{fill:#030504;}
</style>
<g id="Bold" transform="translate(-456.251 -437.592)">
<path id="Path_265" class="st0" d="M467,459.6c-1.1,0-2.1,0-3.2-0.1c-1.1-0.1-2.2-0.2-3.3-0.5v-18.9c1-0.2,2-0.3,3-0.4
c1.1-0.1,2.1-0.1,3-0.1c1.1,0,2.3,0.1,3.4,0.3c0.9,0.1,1.9,0.5,2.7,0.9c0.7,0.4,1.3,1,1.8,1.7c0.4,0.8,0.7,1.7,0.6,2.6
c0,1.6-0.9,3-2.3,3.7c1,0.3,1.9,1,2.5,1.9c0.5,0.8,0.7,1.8,0.7,2.7c0.1,1.8-0.7,3.6-2.2,4.6C471.7,459.2,469.4,459.7,467,459.6z
M464.8,447.5h2.1c1,0.1,2-0.1,2.9-0.5c0.6-0.3,0.9-1,0.9-1.7c0.1-0.7-0.3-1.3-0.9-1.7c-0.8-0.4-1.7-0.5-2.6-0.5
c-0.4,0-0.8,0-1.2,0c-0.4,0-0.8,0-1.2,0.1L464.8,447.5z M464.8,450.8v5c0.3,0,0.7,0.1,1,0.1c0.4,0,0.8,0,1.2,0
c1.1,0,2.2-0.1,3.2-0.6c0.8-0.4,1.3-1.2,1.2-2.1c0.1-0.8-0.3-1.5-1-1.9c-0.9-0.4-1.9-0.6-2.9-0.6L464.8,450.8z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,19 @@
<?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">
<style type="text/css">
.st0{font-family:'Ubuntu-Bold';}
.st1{font-size:5.8624px;}
</style>
<g>
<g>
<path d="M8.2,6.8H21c0.6,0,1-0.5,1-1s-0.5-1-1-1H8.2c-0.6,0-1,0.5-1,1S7.6,6.8,8.2,6.8z"/>
<path d="M21,10.8H8.2c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1H21c0.6,0,1-0.5,1-1C22,11.2,21.5,10.8,21,10.8z"/>
<path d="M21,16.8H8.2c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1H21c0.6,0,1-0.5,1-1C22,17.3,21.5,16.8,21,16.8z"/>
</g>
<text transform="matrix(1 0 0 1 2.0002 7.9709)" class="st0 st1">1</text>
<text transform="matrix(1 0 0 1 2.0002 13.8333)" class="st0 st1">2</text>
<text transform="matrix(1 0 0 1 2.0002 19.6956)" class="st0 st1">3</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 993 B

View file

@ -0,0 +1,18 @@
<?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>
<path id="Path_247" d="M4,4.1c-1.2,0-2.1,1-2.1,2.1c0,1.2,1,2.1,2.1,2.1c1.2,0,2.1-1,2.1-2.1c0-0.6-0.2-1.1-0.6-1.5
C5.1,4.4,4.6,4.1,4,4.1z"/>
<path id="Path_248" d="M4,9.9c-1.2,0-2.1,1-2.1,2.1c0,1.2,1,2.1,2.1,2.1c1.2,0,2.1-1,2.1-2.1c0-0.6-0.2-1.1-0.6-1.5
C5.1,10.1,4.6,9.9,4,9.9z"/>
<path id="Path_249" d="M4,15.6c-1.2,0-2.1,1-2.1,2.1c0,1.2,1,2.1,2.1,2.1c1.2,0,2.1-1,2.1-2.1c0-0.6-0.2-1.1-0.6-1.5
C5.1,15.8,4.6,15.6,4,15.6z"/>
<g>
<path d="M9,7.3h12.1c0.5,0,1-0.4,1-1s-0.4-1-1-1H9c-0.5,0-1,0.4-1,1S8.5,7.3,9,7.3z"/>
<path d="M21.2,11H9c-0.5,0-1,0.4-1,1s0.4,1,1,1h12.1c0.5,0,1-0.4,1-1S21.7,11,21.2,11z"/>
<path d="M21.2,16.8H9c-0.5,0-1,0.4-1,1c0,0.5,0.4,1,1,1h12.1c0.5,0,1-0.4,1-1C22.1,17.2,21.7,16.8,21.2,16.8z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

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 id="Code" d="M7.7,5.9C7.5,5.9,7.3,6,7.1,6.2l-4.8,5.2l0,0c-0.3,0.4-0.3,0.9,0,1.2l4.8,5.2c0.3,0.4,0.9,0.5,1.3,0.2
c0.4-0.3,0.5-0.9,0.2-1.3c0,0-0.1-0.1-0.1-0.1L4.2,12l4.3-4.5c0.3-0.4,0.3-0.9,0-1.3C8.2,6,8,5.9,7.7,5.9z M16.2,5.9L16.2,5.9
c-0.5,0-0.9,0.5-0.8,1c0,0.2,0.1,0.4,0.2,0.5l4.3,4.5l-4.3,4.5c-0.4,0.3-0.4,0.9-0.1,1.3c0.3,0.4,0.9,0.4,1.3,0.1
c0,0,0.1-0.1,0.1-0.1l4.8-5.2c0.3-0.4,0.3-0.9,0-1.2l-4.8-5.2C16.7,6,16.4,5.9,16.2,5.9L16.2,5.9z"/>
</svg>

After

Width:  |  Height:  |  Size: 803 B

View file

@ -0,0 +1,11 @@
<?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">
<style type="text/css">
.st0{fill:#030504;}
</style>
<g id="Italic" transform="translate(-500.334 -437.712)">
<path id="Path_266" class="st0" d="M513.3,439.7h2.8l-4.8,20h-2.8L513.3,439.7z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 550 B

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="Link">
<path d="M10.9,8.7c-1.2,0-2.3,0.5-3.1,1.3l-4.6,4.6C2.5,15.4,2,16.5,2,17.6c0,1.2,0.5,2.3,1.3,3.1S5.2,22,6.3,22s2.3-0.5,3.1-1.3
l3.3-3.3c-0.7,0-1.3-0.2-1.9-0.4l-2.6,2.6c-1.1,1.1-2.8,1.1-3.8,0l-0.1-0.1l0,0c-0.4-0.5-0.7-1.1-0.7-1.8c0-0.7,0.3-1.4,0.8-1.9
l0,0L9,11.1c1-1,2.8-1,3.8,0c0.3,0.3,0.9,0.3,1.2,0c0.2-0.2,0.2-0.4,0.2-0.6S14.2,10.1,14,10C13.2,9.2,12.1,8.7,10.9,8.7z
M10.6,12.6c-0.2,0-0.4,0.1-0.6,0.2c-0.3,0.3-0.3,0.9,0,1.2c1.7,1.7,4.5,1.7,6.1,0l4.6-4.6C21.5,8.6,22,7.5,22,6.4
s-0.5-2.3-1.3-3.1c-1.7-1.7-4.5-1.7-6.1,0l-3.3,3.3c0.7,0,1.3,0.2,1.9,0.4l2.6-2.6c0.5-0.5,1.2-0.8,1.9-0.8c0.7,0,1.4,0.3,1.9,0.8
c0.5,0.5,0.8,1.2,0.8,1.9s-0.3,1.4-0.8,1.9L15,12.9c-1,1-2.8,1.1-3.8,0C11,12.7,10.8,12.6,10.6,12.6z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 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="Quote" transform="translate(-119.998 -268.136)">
<path id="Path_245" d="M140.3,278.1h-3.3c-0.2-1.5,0.1-3,0.9-4.2c0.1-0.2,0.1-0.5-0.1-0.6c-0.1-0.1-0.3-0.1-0.4,0
c-0.6,0.3-1.2,0.6-1.7,1.1c-1.4,1.4-2.3,3.2-2.4,5.1c0,0.2,0,0.3,0,0.4v5.5c0,1,0.8,1.7,1.7,1.7h5.5c1,0,1.7-0.8,1.8-1.7
c0,0,0,0,0,0v-5.5C142,278.9,141.2,278.1,140.3,278.1z"/>
<path id="Path_246" d="M129.2,278.1h-3.3c-0.1-0.9-0.1-1.8,0.2-2.7c0.2-0.5,0.4-1.1,0.7-1.5c0.1-0.2,0.1-0.5-0.1-0.6
c-0.1-0.1-0.3-0.1-0.4,0c-0.6,0.3-1.2,0.6-1.7,1.1c-1.4,1.4-2.3,3.2-2.4,5.1c0,0.2,0,0.3,0,0.4v5.5c0,1,0.8,1.7,1.7,1.8
c0,0,0,0,0,0h5.5c1,0,1.7-0.8,1.8-1.7c0,0,0,0,0,0v-5.5C131,278.9,130.2,278.1,129.2,278.1L129.2,278.1z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1,16 @@
<?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="Barre" transform="translate(-538.1 -437.472)">
<path id="Path_267" d="M549.6,457.1c2.8,0,4.2-1,4.2-2.9c0-0.5-0.1-1-0.4-1.5c-0.3-0.4-0.6-0.8-1-1.1c-0.5-0.3-0.9-0.6-1.5-0.8
c-0.5-0.2-1.1-0.4-1.7-0.7c-0.7-0.2-1.3-0.5-2-0.8c-0.6-0.3-1.1-0.6-1.6-1.1c-0.5-0.4-0.8-0.9-1.1-1.5c-0.3-0.7-0.4-1.4-0.4-2.1
c-0.1-1.5,0.6-3,1.7-3.9c1.4-1,3-1.5,4.7-1.4c1.1,0,2.1,0.1,3.2,0.4c0.7,0.2,1.4,0.4,2.1,0.8l-0.9,2.2c-0.5-0.3-1.1-0.5-1.7-0.7
c-0.9-0.2-1.8-0.4-2.7-0.3c-0.5,0-1,0.1-1.4,0.2c-0.4,0.1-0.8,0.3-1.2,0.5c-0.3,0.2-0.6,0.5-0.8,0.8c-0.2,0.4-0.3,0.8-0.3,1.2
c0,0.5,0.1,0.9,0.3,1.3c0.2,0.4,0.5,0.7,0.9,0.9c0.4,0.3,0.8,0.5,1.3,0.7c0.5,0.2,1,0.4,1.6,0.7c0.8,0.3,1.6,0.7,2.3,1
c0.7,0.3,1.3,0.7,1.8,1.2c0.5,0.5,0.9,1,1.2,1.6c0.3,0.7,0.4,1.5,0.4,2.3c0.1,1.5-0.6,3-1.8,3.9c-1.5,1-3.4,1.5-5.2,1.4
c-0.7,0-1.4,0-2.1-0.2c-0.6-0.1-1.1-0.2-1.7-0.4c-0.4-0.1-0.9-0.3-1.3-0.4c-0.4-0.2-0.6-0.3-0.8-0.4l0.8-2.2
c0.6,0.3,1.3,0.6,1.9,0.8C547.4,457,548.5,457.2,549.6,457.1z"/>
<path id="Path_268" d="M542.8,453v-2.2h14.7v2.2H542.8z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,26 @@
<?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-text-edit-1483720" transform="translate(-240 -240)">
<g id="Path_259">
<path d="M252.6,242v3.6h-1.3v-1.8v-0.5h-0.5h-2.3H248v0.5v11.7v0.5h0.5h1.8v1.3h-6V256h1.8h0.5v-0.5v-11.7v-0.5h-0.5h-2.3h-0.5
v0.5v1.8H242V242H252.6"/>
</g>
<g id="Path_260">
<path d="M262,256v1.3h-6V256H262"/>
</g>
<g id="Path_261">
<path d="M262,260.7v1.3h-20v-1.3H262"/>
</g>
<g id="Path_262">
<path d="M257.3,251.4v1.3H256v-1.3H257.3"/>
</g>
<g id="Path_263">
<path d="M262,246.7v1.3h-6v-1.3H262"/>
</g>
<g id="Path_264">
<path d="M259.7,242v1.3H256V242H259.7"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 937 B

View file

@ -0,0 +1,11 @@
<?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">
<style type="text/css">
.st0{fill:#030504;}
</style>
<g id="Title" transform="translate(-579.093 -437.712)">
<path id="Path_269" class="st0" d="M596,439.7h2.8v20H596v-9.2h-9.8v9.2h-2.8v-20h2.8v8.3h9.8V439.7z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 570 B

View file

@ -58,7 +58,9 @@ extern const QString defaultDownloadPath;
X(LANG, "SYSTEM") \
X(PositionShareDuration, 15) \
X(PositionShareLimit, true) \
X(FlipSelf, true)
X(FlipSelf, true) \
X(ShowMardownOption, false) \
X(ShowSendOption, false)
/*
* A class to expose settings keys in both c++ and QML.

View file

@ -0,0 +1,95 @@
/*
* Copyright (C) 2023 Savoir-faire Linux Inc.
* Author: Franck Laurent <nicolas.vengeon@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.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> menuTypoActionsSecond
contentItem: ListView {
id: listViewTypoSecond
width: contentWidth + leftMargin
height: JamiTheme.chatViewFooterButtonSize
orientation: ListView.Horizontal
interactive: false
leftMargin: 10
spacing: 10
Rectangle {
anchors.fill: parent
color: JamiTheme.chatViewFooterListColor
radius: 5
z: -1
}
model: menuTypoActionsSecond
delegate: PushButton {
anchors.verticalCenter: parent.verticalCenter
preferredSize: JamiTheme.chatViewFooterRealButtonSize
imageContainerWidth: 20
imageContainerHeight: 20
radius: 5
toolTipText: modelData.toolTip
source: modelData.iconSrc
normalColor: JamiTheme.chatViewFooterListColor
imageColor: JamiTheme.chatViewFooterImgColor
hoveredColor: JamiTheme.showMoreButtonOpenColor
pressedColor: hoveredColor
action: modelData
}
}
background: Rectangle {
anchors.fill: parent
color: JamiTheme.chatViewFooterListColor
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

@ -169,7 +169,7 @@ AbstractButton {
},
State {
name: "hovered"
when: hovered || root.focus
when: hovered || root.activeFocus
PropertyChanges {
target: background
color: hoveredColor
@ -177,7 +177,7 @@ AbstractButton {
},
State {
name: "forceHovered"
when: forceHovered || root.focus
when: forceHovered || root.activeFocus
PropertyChanges {
target: background
color: hoveredColor

View file

@ -790,6 +790,21 @@ Item {
property string sendFile: qsTr("Send file")
property string leaveAudioMessage: qsTr("Leave audio message")
property string leaveVideoMessage: qsTr("Leave video message")
property string showMore: qsTr("Show more")
property string showLess: qsTr("Show less")
property string bold: qsTr("Bold")
property string italic: qsTr("Italic")
property string barre: qsTr("Barre")
property string title: qsTr("Title")
property string link: qsTr("Link")
property string code: qsTr("Code")
property string quote: qsTr("Quote")
property string bulletPoint: qsTr("Bullet Point")
property string bulletNumber: qsTr("Bullet Number")
property string showFormating: qsTr("Show Formating")
property string hideFormating: qsTr("Hide Formating")
property string send: qsTr("Send")
property string remove: qsTr("Remove")
property string replyTo: qsTr("Reply to")

View file

@ -231,6 +231,14 @@ Item {
property color messageWebViewFooterButtonImageColor: darkTheme ? "#838383" : "#656565"
property color chatviewUsernameColor: "#A7A7A7"
//ChatView Footer
property color chatViewFooterListColor: darkTheme ? blackColor : "#E5E5E5"
property color chatViewFooterImgColor: darkTheme ? whiteColor : blackColor
property color showMoreButtonOpenColor: darkTheme ? "#123F4A" : "#CCCCCC"
property color chatViewFooterSeparateLineColor: darkTheme ? "#5c5c5c" : "#929292"
property color chatViewFooterSendButtonColor: darkTheme ? "#03B9E9" : "#005699"
property color chatViewFooterSendButtonImgColor: darkTheme ? blackColor : whiteColor
//mapPosition
property color mapButtonsOverlayColor: darkTheme ? "#000000" : "#f0f0f0"
property color mapButtonColor: darkTheme ? "#f0f0f0" : "#000000"
@ -429,8 +437,9 @@ Item {
property real chatViewHeaderPreferredHeight: 64
property real chatViewFooterPreferredHeight: 50
property real chatViewFooterMaximumHeight: 280
property real chatViewFooterRowSpacing: 1
property real chatViewFooterRowSpacing: 4
property real chatViewFooterButtonSize: 36
property real chatViewFooterRealButtonSize: 26
property real chatViewFooterButtonIconSize: 48
property real chatViewFooterButtonRadius: 5
property real chatViewFooterTextAreaMaximumHeight: 130

View file

@ -66,7 +66,7 @@ Rectangle {
Shortcut {
sequence: "Ctrl+M"
context: Qt.ApplicationShortcut
onActivated: JamiQmlUtils.settingsPageRequested(SettingsView.Media)
onActivated: JamiQmlUtils.settingsPageRequested(12)
}
WheelHandler {
@ -119,19 +119,19 @@ Rectangle {
Shortcut {
sequence: "Ctrl+G"
context: Qt.ApplicationShortcut
onActivated: JamiQmlUtils.settingsPageRequested(SettingsView.General)
onActivated: JamiQmlUtils.settingsPageRequested(5)
}
Shortcut {
sequence: "Ctrl+I"
sequence: "Ctrl+Alt+I"
context: Qt.ApplicationShortcut
onActivated: JamiQmlUtils.settingsPageRequested(SettingsView.Account)
onActivated: JamiQmlUtils.settingsPageRequested(0)
}
Shortcut {
sequence: "Ctrl+P"
context: Qt.ApplicationShortcut
onActivated: JamiQmlUtils.settingsPageRequested(SettingsView.Plugin)
onActivated: JamiQmlUtils.settingsPageRequested(15)
}
Shortcut {

View file

@ -130,7 +130,6 @@ Rectangle {
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: footerColumnLayout.width
Layout.preferredHeight: implicitHeight
property var emojiPicker
Connections {
@ -157,17 +156,16 @@ Rectangle {
}
function setXposition() {
return messageBar.width - JamiTheme.emojiPickerWidth; //- JamiTheme.emojiMargins
return messageBar.width - JamiTheme.emojiPickerWidth;
}
function setYposition() {
return -JamiTheme.emojiPickerHeight; //- JamiTheme.emojiMargins
return -JamiTheme.emojiPickerHeight;
}
sendButtonVisibility: text || dataTransferSendContainer.filesToSendCount
onEmojiButtonClicked: {
JamiQmlUtils.updateMessageBarButtonsPoints();
openEmojiPicker();
}
@ -185,6 +183,16 @@ Rectangle {
});
}
onVideoRecordMessageButtonClicked: {
recordBox.y = -recordBox.height;
recordBox.openRecorder(true);
}
onAudioRecordMessageButtonClicked: {
recordBox.y = -recordBox.height;
recordBox.openRecorder(false);
}
onSendMessageButtonClicked: {
// Send file messages
var fileCounts = dataTransferSendContainer.filesToSendListModel.rowCount();
@ -205,32 +213,6 @@ Rectangle {
messageBar.textAreaObj.clearText();
MessagesAdapter.replyToId = "";
}
onVideoRecordMessageButtonClicked: {
JamiQmlUtils.updateMessageBarButtonsPoints();
recordBox.parent = JamiQmlUtils.mainViewRectObj;
recordBox.x = Qt.binding(function () {
var buttonCenterX = JamiQmlUtils.videoRecordMessageButtonInMainViewPoint.x + JamiQmlUtils.videoRecordMessageButtonObj.width / 2;
return buttonCenterX - recordBox.width / 2;
});
recordBox.y = Qt.binding(function () {
var buttonY = JamiQmlUtils.videoRecordMessageButtonInMainViewPoint.y;
return buttonY - recordBox.height - recordBox.spikeHeight;
});
recordBox.openRecorder(true);
}
onAudioRecordMessageButtonClicked: {
JamiQmlUtils.updateMessageBarButtonsPoints();
recordBox.parent = JamiQmlUtils.mainViewRectObj;
recordBox.x = Qt.binding(function () {
var buttonCenterX = JamiQmlUtils.audioRecordMessageButtonInMainViewPoint.x + JamiQmlUtils.audioRecordMessageButtonObj.width / 2;
return buttonCenterX - recordBox.width / 2;
});
recordBox.y = Qt.binding(function () {
var buttonY = JamiQmlUtils.audioRecordMessageButtonInMainViewPoint.y;
return buttonY - recordBox.height - recordBox.spikeHeight;
});
recordBox.openRecorder(false);
}
}
FilesToSendContainer {

View file

@ -151,7 +151,7 @@ Window {
description: qsTr("General settings")
}
ListElement {
shortcut: "Ctrl + I"
shortcut: "Ctrl + Alt + I"
shortcut2: ""
description: qsTr("Account settings")
}

View file

@ -17,8 +17,11 @@
*/
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import SortFilterProxyModel 0.2
import net.jami.Adapters 1.1
import net.jami.Models 1.1
import net.jami.Enums 1.1
import net.jami.Constants 1.1
import "../../commoncomponents"
@ -30,6 +33,11 @@ ColumnLayout {
property real marginSize: JamiTheme.messageBarMarginSize
property bool sendButtonVisibility: false
property bool animate: false
property bool showDefault: !UtilsAdapter.getAppValue(Settings.Key.ShowSendOption)
property bool showTypo: UtilsAdapter.getAppValue(Settings.Key.ShowMardownOption)
property bool showTypoSecond: false
property int messageBarLayoutMaximumWidth: 486
signal sendMessageButtonClicked
signal sendFileButtonClicked
@ -38,9 +46,7 @@ ColumnLayout {
signal showMapClicked
signal emojiButtonClicked
implicitHeight: messageBarRowLayout.height
spacing: 0
spacing: 5
Rectangle {
id: messageBarHairLine
@ -52,188 +58,796 @@ ColumnLayout {
color: JamiTheme.tabbarBorderColor
}
RowLayout {
id: messageBarRowLayout
MessageBarTextArea {
id: textArea
Layout.alignment: Qt.AlignCenter
objectName: "messageBarTextArea"
// forward activeFocus to the actual text area object
onActiveFocusChanged: {
if (activeFocus)
textAreaObj.forceActiveFocus();
}
placeholderText: JamiStrings.writeTo.arg(CurrentConversation.title)
Layout.alignment: Qt.AlignVCenter
Layout.fillWidth: true
Layout.maximumWidth: JamiTheme.chatViewMaximumWidth
spacing: JamiTheme.chatViewFooterRowSpacing
PushButton {
id: showMapButton
Layout.alignment: Qt.AlignVCenter
Layout.leftMargin: marginSize
Layout.preferredWidth: JamiTheme.chatViewFooterButtonSize
Layout.preferredHeight: JamiTheme.chatViewFooterButtonSize
visible: WITH_WEBENGINE && !CurrentConversation.isSip
radius: JamiTheme.chatViewFooterButtonRadius
preferredSize: JamiTheme.chatViewFooterButtonIconSize
toolTipText: JamiStrings.shareLocation
source: JamiResources.share_location_svg
normalColor: JamiTheme.primaryBackgroundColor
imageColor: JamiTheme.messageWebViewFooterButtonImageColor
onClicked: root.showMapClicked()
Layout.leftMargin: marginSize / 2
Layout.rightMargin: marginSize / 2
Layout.preferredHeight: {
return JamiTheme.chatViewFooterPreferredHeight > contentHeight ? JamiTheme.chatViewFooterPreferredHeight : contentHeight;
}
Layout.maximumHeight: JamiTheme.chatViewFooterTextAreaMaximumHeight - marginSize / 2
PushButton {
id: sendFileButton
onSendMessagesRequired: root.sendMessageButtonClicked()
onTextChanged: MessagesAdapter.userIsComposing(text ? true : false)
Layout.alignment: Qt.AlignVCenter
Layout.preferredWidth: JamiTheme.chatViewFooterButtonSize
Layout.preferredHeight: JamiTheme.chatViewFooterButtonSize
radius: JamiTheme.chatViewFooterButtonRadius
preferredSize: JamiTheme.chatViewFooterButtonIconSize - 6
toolTipText: JamiStrings.sendFile
visible: !CurrentConversation.isSip
source: JamiResources.link_black_24dp_svg
normalColor: JamiTheme.primaryBackgroundColor
imageColor: JamiTheme.messageWebViewFooterButtonImageColor
onClicked: root.sendFileButtonClicked()
}
PushButton {
id: audioRecordMessageButton
Layout.alignment: Qt.AlignVCenter
Layout.preferredWidth: JamiTheme.chatViewFooterButtonSize
Layout.preferredHeight: JamiTheme.chatViewFooterButtonSize
radius: JamiTheme.chatViewFooterButtonRadius
preferredSize: JamiTheme.chatViewFooterButtonIconSize
toolTipText: JamiStrings.leaveAudioMessage
visible: !CurrentConversation.isSip
source: JamiResources.message_audio_black_24dp_svg
normalColor: JamiTheme.primaryBackgroundColor
imageColor: JamiTheme.messageWebViewFooterButtonImageColor
onClicked: root.audioRecordMessageButtonClicked()
Component.onCompleted: JamiQmlUtils.audioRecordMessageButtonObj = audioRecordMessageButton
}
PushButton {
id: videoRecordMessageButton
Layout.alignment: Qt.AlignVCenter
Layout.preferredWidth: JamiTheme.chatViewFooterButtonSize
Layout.preferredHeight: JamiTheme.chatViewFooterButtonSize
visible: VideoDevices.listSize !== 0 && !CurrentConversation.isSip
radius: JamiTheme.chatViewFooterButtonRadius
preferredSize: JamiTheme.chatViewFooterButtonIconSize
toolTipText: JamiStrings.leaveVideoMessage
source: JamiResources.message_video_black_24dp_svg
normalColor: JamiTheme.primaryBackgroundColor
imageColor: JamiTheme.messageWebViewFooterButtonImageColor
onClicked: root.videoRecordMessageButtonClicked()
Component.onCompleted: JamiQmlUtils.videoRecordMessageButtonObj = videoRecordMessageButton
}
MessageBarTextArea {
id: textArea
objectName: "messageBarTextArea"
// forward activeFocus to the actual text area object
onActiveFocusChanged: {
if (activeFocus)
textAreaObj.forceActiveFocus();
property var markdownShortCut: {
"Bold": function () {
listViewTypoFirst.itemAtIndex(0).action.triggered();
},
"Italic": function () {
listViewTypoFirst.itemAtIndex(1).action.triggered();
},
"Barre": function () {
listViewTypoFirst.itemAtIndex(2).action.triggered();
},
"Heading": function () {
listViewTypoFirst.itemAtIndex(3).action.triggered();
},
"Link": function () {
listViewTypoSecond.itemAtIndex(0).action.triggered();
},
"Code": function () {
listViewTypoSecond.itemAtIndex(1).action.triggered();
},
"Quote": function () {
listViewTypoSecond.itemAtIndex(2).action.triggered();
},
"Bulleted List": function () {
listViewTypoSecond.itemAtIndex(3).action.triggered();
},
"Numbered List": function () {
listViewTypoSecond.itemAtIndex(4).action.triggered();
}
}
placeholderText: JamiStrings.writeTo.arg(CurrentConversation.title)
Shortcut {
sequence: "Ctrl+B"
context: Qt.ApplicationShortcut
onActivated: textArea.markdownShortCut["Bold"]()
}
Layout.alignment: Qt.AlignVCenter
Layout.fillWidth: true
Layout.margins: marginSize / 2
Layout.preferredHeight: {
return JamiTheme.chatViewFooterPreferredHeight > contentHeight ? JamiTheme.chatViewFooterPreferredHeight : contentHeight;
Shortcut {
sequence: "Ctrl+I"
context: Qt.ApplicationShortcut
onActivated: textArea.markdownShortCut["Italic"]()
}
Shortcut {
sequence: "Shift+Alt+X"
context: Qt.ApplicationShortcut
onActivated: textArea.markdownShortCut["Barre"]()
}
Shortcut {
sequence: "Ctrl+Alt+H"
context: Qt.ApplicationShortcut
onActivated: textArea.markdownShortCut["Heading"]()
}
Shortcut {
sequence: "Ctrl+Alt+K"
context: Qt.ApplicationShortcut
onActivated: textArea.markdownShortCut["Link"]()
}
Shortcut {
sequence: "Ctrl+Alt+C"
context: Qt.ApplicationShortcut
onActivated: textArea.markdownShortCut["Code"]()
}
Shortcut {
sequence: "Shift+Alt+9"
context: Qt.ApplicationShortcut
onActivated: textArea.markdownShortCut["Quote"]()
}
Shortcut {
sequence: "Shift+Alt+8"
context: Qt.ApplicationShortcut
onActivated: textArea.markdownShortCut["Bulleted List"]()
}
Shortcut {
sequence: "Shift+Alt+7"
context: Qt.ApplicationShortcut
onActivated: textArea.markdownShortCut["Numbered List"]()
}
}
Item {
id: messageBar
Layout.fillWidth: true
Layout.preferredHeight: JamiTheme.chatViewFooterButtonSize
Layout.leftMargin: marginSize
Layout.bottomMargin: marginSize
onWidthChanged: {
if (width < messageBarRowLayout.width + sendButtonRow.width + 2 * JamiTheme.preferredMarginSize) {
showTypoSecond = false;
} else {
if (width > 2 * messageBarRowLayout.width) {
showTypoSecond = true;
}
}
Layout.maximumHeight: JamiTheme.chatViewFooterTextAreaMaximumHeight - marginSize / 2
onSendMessagesRequired: root.sendMessageButtonClicked()
onTextChanged: MessagesAdapter.userIsComposing(text ? true : false)
}
PushButton {
id: emojiButton
visible: WITH_WEBENGINE
RowLayout {
id: messageBarRowLayout
Layout.alignment: Qt.AlignVCenter
Layout.rightMargin: sendMessageButton.visible ? 0 : marginSize
Layout.preferredWidth: JamiTheme.chatViewFooterButtonSize
Layout.preferredHeight: JamiTheme.chatViewFooterButtonSize
spacing: JamiTheme.chatViewFooterRowSpacing
radius: JamiTheme.chatViewFooterButtonRadius
preferredSize: JamiTheme.chatViewFooterButtonIconSize
Row {
toolTipText: JamiStrings.addEmoji
PushButton {
id: typoButton
source: JamiResources.emoji_black_24dp_svg
preferredSize: JamiTheme.chatViewFooterButtonSize
imageContainerWidth: 24
imageContainerHeight: 24
normalColor: JamiTheme.primaryBackgroundColor
imageColor: JamiTheme.messageWebViewFooterButtonImageColor
radius: JamiTheme.chatViewFooterButtonRadius
onClicked: root.emojiButtonClicked()
toolTipText: showTypo ? JamiStrings.hideFormating : JamiStrings.showFormating
source: JamiResources.text_edit_black_24dp_svg
Component.onCompleted: JamiQmlUtils.emojiPickerButtonObj = emojiButton
}
normalColor: !showTypo ? JamiTheme.chatViewFooterListColor : JamiTheme.showMoreButtonOpenColor
imageColor: JamiTheme.chatViewFooterImgColor
pressedColor: JamiTheme.showMoreButtonOpenColor
hoveredColor: JamiTheme.showMoreButtonOpenColor
PushButton {
id: sendMessageButton
onClicked: {
showTypo = !showTypo;
if (messageBar.width < messageBarLayoutMaximumWidth + sendButtonRow.width + 2 * JamiTheme.preferredMarginSize)
showTypoSecond = false;
if (!showDefault)
showDefault = true;
UtilsAdapter.setAppValue(Settings.Key.ShowMardownOption, showTypo);
UtilsAdapter.setAppValue(Settings.Key.ShowSendOption, !showDefault);
}
objectName: "sendMessageButton"
Rectangle {
visible: showTypo
Layout.alignment: Qt.AlignVCenter
Layout.rightMargin: visible ? marginSize : 0
Layout.preferredWidth: scale * JamiTheme.chatViewFooterButtonSize
Layout.preferredHeight: JamiTheme.chatViewFooterButtonSize
anchors.fill: parent
anchors.leftMargin: 3
anchors.rightMargin: -5
color: JamiTheme.showMoreButtonOpenColor
z: -2
}
}
radius: JamiTheme.chatViewFooterButtonRadius
preferredSize: JamiTheme.chatViewFooterButtonIconSize - 6
Row {
id: listViewTypo
height: JamiTheme.chatViewFooterButtonSize
toolTipText: JamiStrings.send
function addStyle(text, start, end, char1, char2) {
// get the selected text with markdown effect
var selectedText = text.substring(start - char1.length, end + char2.length);
if (selectedText.startsWith(char1) && selectedText.endsWith(char2)) {
// If the selected text is already formatted with the given characters, remove them
selectedText = text.substring(start, end);
root.text = text.substring(0, start - char1.length) + selectedText + text.substring(end + char2.length);
textArea.selectText(start - char1.length, end - char1.length);
} else {
// Otherwise, add the formatting characters to the selected text
root.text = text.substring(0, start) + char1 + text.substring(start, end) + char2 + text.substring(end);
textArea.selectText(start + char1.length, end + char1.length);
}
}
source: JamiResources.send_black_24dp_svg
function addPrefixStyle(message, selectionStart, selectionEnd, delimiter, isBulletNumber) {
normalColor: JamiTheme.primaryBackgroundColor
imageColor: JamiTheme.messageWebViewFooterButtonImageColor
//represents all the selected lines
var multilineSelection;
var newPrefix;
var newSuffix;
var newStartPos;
var newEndPos;
function nextIndexOf(text, char1, startPos) {
return text.indexOf(char1, startPos + 1);
}
opacity: sendButtonVisibility ? 1 : 0
visible: opacity
scale: opacity
//get the previous index of the multilineSelection text
if (message[selectionStart] === "\n")
newStartPos = message.lastIndexOf('\n', selectionStart - 1);
else
newStartPos = message.lastIndexOf('\n', selectionStart);
Behavior on opacity {
enabled: animate
NumberAnimation {
duration: JamiTheme.shortFadeDuration
easing.type: Easing.InOutQuad
//get the next index of the multilineSelection text
if (message[selectionEnd] === "\n" || message[selectionEnd] === undefined)
newEndPos = selectionEnd;
else
newEndPos = nextIndexOf(message, "\n", selectionEnd);
//if the text is empty
if (newStartPos === -1)
newStartPos = 0;
newPrefix = message.slice(0, newStartPos);
multilineSelection = message.slice(newStartPos, newEndPos);
newSuffix = message.slice(newEndPos);
var isFirstLineSelected = !multilineSelection.startsWith('\n') || newPrefix === "";
var getDelimiter_counter = 1;
function getDelimiter() {
return `${getDelimiter_counter++}. `;
}
function getHasCurrentMarkdown() {
const linesQuantity = (multilineSelection.match(/\n/g) || []).length;
const newLinesWithDelimitersQuantity = (multilineSelection.match(new RegExp(`\n${delimiter}`, 'g')) || []).length;
if (newLinesWithDelimitersQuantity === linesQuantity && !isFirstLineSelected)
return true;
return linesQuantity === newLinesWithDelimitersQuantity && multilineSelection.startsWith(delimiter);
}
function getHasCurrentMarkdownBullet() {
const linesQuantity = (multilineSelection.match(/\n/g) || []).length;
const newLinesWithDelimitersQuantity = (multilineSelection.match(/\n\d+\. /g) || []).length;
if (newLinesWithDelimitersQuantity === linesQuantity && !isFirstLineSelected)
return true;
return linesQuantity === newLinesWithDelimitersQuantity && (/^\d\. /).test(multilineSelection);
}
var newValue;
var newStart;
var newEnd;
var count;
var startPos;
var multilineSelectionLength;
if (!isBulletNumber) {
if (getHasCurrentMarkdown()) {
// clear first line from delimiter
if (isFirstLineSelected)
multilineSelection = multilineSelection.slice(delimiter.length);
newValue = newPrefix + multilineSelection.replace(new RegExp(`\n${delimiter}`, 'g'), '\n') + newSuffix;
count = 0;
if (isFirstLineSelected)
count++;
count += (multilineSelection.match(/\n/g) || []).length;
newStart = Math.max(selectionStart - delimiter.length, 0);
newEnd = Math.max(selectionEnd - (delimiter.length * count), 0);
} else {
newValue = newPrefix + multilineSelection.replace(/\n/g, `\n${delimiter}`) + newSuffix;
count = 0;
if (isFirstLineSelected) {
newValue = delimiter + newValue;
count++;
}
count += (multilineSelection.match(new RegExp('\\n', 'g')) || []).length;
newStart = selectionStart + delimiter.length;
newEnd = selectionEnd + (delimiter.length * count);
}
} else if (getHasCurrentMarkdownBullet()) {
if (message[selectionStart] === "\n")
startPos = message.lastIndexOf('\n', selectionStart - 1) + 1;
else
startPos = message.lastIndexOf('\n', selectionStart) + 1;
newStart = startPos;
multilineSelection = multilineSelection.replace(/^\d+\.\s/gm, '');
newValue = newPrefix + multilineSelection + newSuffix;
multilineSelectionLength = multilineSelection.length;
//if the first line is not selected, we need to remove the first "\n" of multilineSelection
if (newStart)
multilineSelectionLength = multilineSelection.length - 1;
newEnd = Math.max(newStart + multilineSelectionLength, 0);
} else {
if (message[selectionStart] === "\n")
startPos = message.lastIndexOf('\n', selectionStart - 1) + 1;
else
startPos = message.lastIndexOf('\n', selectionStart) + 1;
newStart = startPos;
// if no text is selected
if (selectionStart === selectionEnd)
newStart = newStart + 3;
if (isFirstLineSelected)
multilineSelection = getDelimiter() + multilineSelection;
const selectionArr = Array.from(multilineSelection);
for (var i = 0; i < selectionArr.length; i++) {
if (selectionArr[i] === '\n')
selectionArr[i] = `\n${getDelimiter()}`;
}
multilineSelection = selectionArr.join('');
newValue = newPrefix + multilineSelection + newSuffix;
multilineSelectionLength = multilineSelection.length;
//if the first line is not selected, we meed to remove the first "\n" of multilineSelection
if (startPos)
multilineSelectionLength = multilineSelection.length - 1;
newEnd = Math.max(startPos + multilineSelectionLength, 0);
}
root.text = newValue;
textArea.selectText(newStart, newEnd);
}
ListView {
id: listViewTypoFirst
objectName: "listViewTypoFirst"
visible: width > 0
width: showTypo ? contentWidth + 2 * leftMargin : 0
Behavior on width {
NumberAnimation {
duration: JamiTheme.longFadeDuration
}
}
height: JamiTheme.chatViewFooterButtonSize
orientation: ListView.Horizontal
interactive: false
leftMargin: 10
rightMargin: 10
spacing: 10
Rectangle {
anchors.fill: parent
color: JamiTheme.chatViewFooterListColor
z: -1
}
property list<Action> menuTypoActionsFirst: [
Action {
id: boldAction
property var iconSrc: JamiResources.bold_black_24dp_svg
property var toolTip: JamiStrings.bold
onTriggered: function clickAction() {
listViewTypo.addStyle(root.text, textArea.selectionStart, textArea.selectionEnd, "**", "**");
}
},
Action {
id: italicAction
property var iconSrc: JamiResources.italic_black_24dp_svg
property var toolTip: JamiStrings.italic
onTriggered: function clickAction() {
listViewTypo.addStyle(root.text, textArea.selectionStart, textArea.selectionEnd, "*", "*");
}
},
Action {
id: barreAction
property var iconSrc: JamiResources.s_barre_black_24dp_svg
property var toolTip: JamiStrings.barre
onTriggered: function clickAction() {
listViewTypo.addStyle(root.text, textArea.selectionStart, textArea.selectionEnd, "~~", "~~");
}
},
Action {
id: titleAction
property var iconSrc: JamiResources.title_black_24dp_svg
property var toolTip: JamiStrings.title
onTriggered: function clickAction() {
listViewTypo.addPrefixStyle(root.text, textArea.selectionStart, textArea.selectionEnd, "### ", false);
}
}
]
model: menuTypoActionsFirst
delegate: PushButton {
anchors.verticalCenter: parent.verticalCenter
preferredSize: JamiTheme.chatViewFooterRealButtonSize
imageContainerWidth: 15
imageContainerHeight: 15
radius: 5
toolTipText: modelData.toolTip
source: modelData.iconSrc
normalColor: JamiTheme.chatViewFooterListColor
imageColor: JamiTheme.chatViewFooterImgColor
hoveredColor: JamiTheme.showMoreButtonOpenColor
pressedColor: hoveredColor
action: modelData
}
}
Rectangle {
height: JamiTheme.chatViewFooterButtonSize
color: JamiTheme.chatViewFooterListColor
visible: width > 0
width: showTypo && showTypoSecond ? 2 : 0
Behavior on width {
NumberAnimation {
duration: JamiTheme.longFadeDuration
}
}
Rectangle {
anchors.verticalCenter: parent.verticalCenter
width: 2
height: JamiTheme.chatViewFooterButtonSize / 2
color: JamiTheme.chatViewFooterSeparateLineColor
}
}
Rectangle {
z: -1
radius: 0
color: JamiTheme.chatViewFooterListColor
width: JamiTheme.chatViewFooterButtonSize
height: JamiTheme.chatViewFooterButtonSize
visible: showTypo && !showTypoSecond
ComboBox {
id: showMoreTypoButton
width: JamiTheme.chatViewFooterRealButtonSize
height: width
anchors.verticalCenter: parent.verticalCenter
MaterialToolTip {
id: toolTip
parent: showMoreTypoButton
visible: showMoreTypoButton.hovered && (text.length > 0)
delay: Qt.styleHints.mousePressAndHoldInterval
text: JamiStrings.showMore
}
background: Rectangle {
implicitWidth: showMoreTypoButton.width
implicitHeight: showMoreTypoButton.height
radius: 5
color: showMoreTypoButton.popup.opened || showMoreTypoButton.hovered ? JamiTheme.showMoreButtonOpenColor : JamiTheme.chatViewFooterListColor
}
indicator: ResponsiveImage {
containerHeight: 20
containerWidth: 20
width: 18
height: 18
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
source: JamiResources.more_vert_24dp_svg
color: JamiTheme.chatViewFooterImgColor
}
popup: MarkdownPopup {
y: 1.5 * parent.height
x: -parent.width * 3
width: 190
height: JamiTheme.chatViewFooterButtonSize
menuTypoActionsSecond: listViewTypoSecond.menuTypoActionsSecond
}
}
}
ListView {
id: listViewTypoSecond
visible: width > 0
width: showTypo && showTypoSecond ? contentWidth + 2 * leftMargin : 0
Behavior on width {
NumberAnimation {
duration: JamiTheme.longFadeDuration
}
}
height: JamiTheme.chatViewFooterButtonSize
orientation: ListView.Horizontal
interactive: false
leftMargin: 10
rightMargin: 10
spacing: 10
Rectangle {
anchors.fill: parent
color: JamiTheme.chatViewFooterListColor
z: -1
}
property list<Action> menuTypoActionsSecond: [
Action {
id: linkAction
property var iconSrc: JamiResources.link_web_black_24dp_svg
property var toolTip: JamiStrings.link
onTriggered: function clickAction() {
listViewTypo.addStyle(root.text, textArea.selectionStart, textArea.selectionEnd, "[", "](url)");
}
},
Action {
id: codeAction
property var iconSrc: JamiResources.code_black_24dp_svg
property var toolTip: JamiStrings.code
onTriggered: function clickAction() {
listViewTypo.addStyle(root.text, textArea.selectionStart, textArea.selectionEnd, "```", "```");
}
},
Action {
id: quoteAction
property var iconSrc: JamiResources.quote_black_24dp_svg
property var toolTip: JamiStrings.quote
onTriggered: function clickAction() {
listViewTypo.addPrefixStyle(root.text, textArea.selectionStart, textArea.selectionEnd, "> ", false);
}
},
Action {
id: bulletPointAction
property var iconSrc: JamiResources.bullet_point_black_24dp_svg
property var toolTip: JamiStrings.bulletPoint
onTriggered: function clickAction() {
listViewTypo.addPrefixStyle(root.text, textArea.selectionStart, textArea.selectionEnd, "- ", false);
}
},
Action {
id: bulletNumberAction
property var iconSrc: JamiResources.bullet_number_black_24dp_svg
property var toolTip: JamiStrings.bulletNumber
onTriggered: function clickAction() {
listViewTypo.addPrefixStyle(root.text, textArea.selectionStart, textArea.selectionEnd, "", true);
}
}
]
model: menuTypoActionsSecond
delegate: PushButton {
anchors.verticalCenter: parent.verticalCenter
preferredSize: JamiTheme.chatViewFooterRealButtonSize
imageContainerWidth: 20
imageContainerHeight: 20
radius: 5
toolTipText: modelData.toolTip
source: modelData.iconSrc
normalColor: JamiTheme.chatViewFooterListColor
imageColor: JamiTheme.chatViewFooterImgColor
hoveredColor: JamiTheme.showMoreButtonOpenColor
pressedColor: hoveredColor
action: modelData
}
}
}
}
onClicked: root.sendMessageButtonClicked()
Row {
ListView {
id: listViewAction
width: contentWidth + 2 * leftMargin
Behavior on width {
NumberAnimation {
duration: JamiTheme.longFadeDuration
}
}
height: JamiTheme.chatViewFooterButtonSize
orientation: ListView.Horizontal
interactive: false
leftMargin: 10
rightMargin: 10
spacing: 10
Rectangle {
anchors.fill: parent
color: JamiTheme.chatViewFooterListColor
z: -1
}
property list<Action> menuActions: [
Action {
id: sendFile
property var iconSrc: JamiResources.link_black_24dp_svg
property var toolTip: JamiStrings.sendFile
property bool show: true
property bool needWebEngine: false
property bool needVideoDevice: false
property bool noSip: false
onTriggered: function clickAction() {
sendFileButtonClicked();
}
},
Action {
id: addEmoji
property var iconSrc: JamiResources.emoji_black_24dp_svg
property var toolTip: JamiStrings.addEmoji
property bool show: true
property bool needWebEngine: true
property bool needVideoDevice: false
property bool noSip: true
onTriggered: function clickAction() {
emojiButtonClicked();
}
},
Action {
id: leaveAudioMessage
property var iconSrc: JamiResources.message_audio_black_24dp_svg
property var toolTip: JamiStrings.leaveAudioMessage
property bool show: false
property bool needWebEngine: false
property bool needVideoDevice: false
property bool noSip: false
onTriggered: function clickAction() {
audioRecordMessageButtonClicked();
}
},
Action {
id: leaveVideoMessage
property var iconSrc: JamiResources.message_video_black_24dp_svg
property var toolTip: JamiStrings.leaveVideoMessage
property bool show: false
property bool needWebEngine: false
property bool needVideoDevice: true
property bool noSip: false
onTriggered: function clickAction() {
videoRecordMessageButtonClicked();
}
},
Action {
id: shareLocation
property var iconSrc: JamiResources.localisation_sharing_send_pin_svg
property var toolTip: JamiStrings.shareLocation
property bool show: false
property bool needWebEngine: false
property bool needVideoDevice: false
property bool noSip: false
onTriggered: function clickAction() {
showMapClicked();
}
}
]
ListModel {
id: listActions
Component.onCompleted: {
for (var i = 0; i < listViewAction.menuActions.length; i++) {
append({
"menuAction": listViewAction.menuActions[i]
});
}
}
}
model: SortFilterProxyModel {
sourceModel: listActions
filters: [
ExpressionFilter {
expression: menuAction.show === true
enabled: root.showDefault
},
ExpressionFilter {
expression: menuAction.needWebEngine === false
enabled: !WITH_WEBENGINE
},
ExpressionFilter {
expression: menuAction.noSip === true
enabled: CurrentConversation.isSip
},
ExpressionFilter {
expression: menuAction.needVideoDevice === false
enabled: VideoDevices.listSize === 0
}
]
}
delegate: PushButton {
id: buttonDelegate
anchors.verticalCenter: parent ? parent.verticalCenter : undefined
preferredSize: JamiTheme.chatViewFooterRealButtonSize
imageContainerWidth: 20
imageContainerHeight: 20
radius: 5
toolTipText: modelData.toolTip
source: modelData.iconSrc
normalColor: JamiTheme.chatViewFooterListColor
imageColor: JamiTheme.chatViewFooterImgColor
hoveredColor: JamiTheme.showMoreButtonOpenColor
pressedColor: hoveredColor
action: modelData
}
}
Rectangle {
z: -1
radius: 0
color: showMoreButton.normalColor
width: JamiTheme.chatViewFooterButtonSize / 2
height: JamiTheme.chatViewFooterButtonSize
PushButton {
id: showMoreButton
anchors.left: parent.left
preferredSize: JamiTheme.chatViewFooterButtonSize
imageContainerWidth: 20
imageContainerHeight: 20
radius: JamiTheme.chatViewFooterButtonRadius
toolTipText: showDefault ? JamiStrings.showMore : JamiStrings.showLess
source: JamiResources.more_vert_24dp_svg
normalColor: showDefault ? JamiTheme.chatViewFooterListColor : JamiTheme.showMoreButtonOpenColor
imageColor: JamiTheme.chatViewFooterImgColor
pressedColor: JamiTheme.showMoreButtonOpenColor
hoveredColor: JamiTheme.showMoreButtonOpenColor
onClicked: {
showDefault = !showDefault;
if (showTypo)
showTypo = false;
UtilsAdapter.setAppValue(Settings.Key.ShowMardownOption, showTypo);
UtilsAdapter.setAppValue(Settings.Key.ShowSendOption, !showDefault);
}
}
}
}
}
Component.onCompleted: JamiQmlUtils.messageBarButtonsRowObj = messageBarRowLayout
Row {
id: sendButtonRow
spacing: JamiTheme.chatViewFooterRowSpacing
anchors.right: parent.right
anchors.rightMargin: sendMessageButton.visible ? marginSize : 0
PushButton {
id: sendMessageButton
objectName: "sendMessageButton"
width: scale * JamiTheme.chatViewFooterButtonSize
height: JamiTheme.chatViewFooterButtonSize
radius: JamiTheme.chatViewFooterButtonRadius
preferredSize: JamiTheme.chatViewFooterButtonIconSize - 6
imageContainerWidth: 25
imageContainerHeight: 25
toolTipText: JamiStrings.send
source: JamiResources.send_black_24dp_svg
normalColor: JamiTheme.chatViewFooterSendButtonColor
imageColor: JamiTheme.chatViewFooterSendButtonImgColor
hoveredColor: JamiTheme.buttonTintedBlueHovered
pressedColor: hoveredColor
opacity: sendButtonVisibility ? 1 : 0
visible: opacity
scale: opacity
Behavior on opacity {
enabled: animate
NumberAnimation {
duration: JamiTheme.shortFadeDuration
easing.type: Easing.InOutQuad
}
}
onClicked: root.sendMessageButtonClicked()
}
}
}
}

View file

@ -27,12 +27,19 @@ JamiFlickable {
property alias text: textArea.text
property var textAreaObj: textArea
property alias placeholderText: textArea.placeholderText
property alias selectedText: textArea.selectedText
property alias selectionStart: textArea.selectionStart
property alias selectionEnd: textArea.selectionEnd
ScrollBar.vertical.visible: textArea.text
ScrollBar.horizontal.visible: textArea.text
signal sendMessagesRequired
function selectText(start, end) {
textArea.select(start, end);
}
function insertText(text) {
textArea.insert(textArea.cursorPosition, text);
}
@ -68,6 +75,8 @@ JamiFlickable {
topPadding: 0
bottomPadding: 0
persistentSelection: true
verticalAlignment: TextEdit.AlignVCenter
font.pointSize: JamiTheme.textFontSize + 2

View file

@ -55,7 +55,8 @@ SidePanelBase {
target: JamiQmlUtils
function onSettingsPageRequested(index) {
viewCoordinator.present("SettingsView");
buttonGroup.checkedButton = buttonGroup.buttons[index];
root.indexSelected(index);
root.currentIndex = index;
}
}