mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-01-17 11:28:07 +00:00
Deactivate video if no codecs are selected. Link to licence in about. Fix loosing ICE configuration. Fix click shortcut on the first item on smartsearch bar. Add separated and editable prefix phone number in assistant.
344 lines
9.3 KiB
QML
344 lines
9.3 KiB
QML
import QtQuick 2.7
|
|
import QtQuick.Layouts 1.3
|
|
|
|
import Common 1.0
|
|
import Linphone 1.0
|
|
import LinphoneEnums 1.0
|
|
import UtilsCpp 1.0
|
|
|
|
import App.Styles 1.0
|
|
import Linphone.Styles 1.0
|
|
import Common.Styles 1.0
|
|
|
|
// =============================================================================
|
|
|
|
ScrollableListView {
|
|
id: sipAddressesView
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
// Contains a list of: {
|
|
// icon: 'string',
|
|
// handler: function () { ... }
|
|
// }
|
|
property var actions: []
|
|
|
|
property string genSipAddress
|
|
|
|
// Optional parameters.
|
|
property string headerButtonDescription
|
|
property string headerButtonIcon
|
|
property color headerButtonOverwriteColor
|
|
property var headerButtonAction
|
|
property bool showHeader : true
|
|
property bool showSubtitle : true
|
|
property bool showSwitch : false
|
|
property bool showSeparator : true
|
|
property bool isSelectable : true
|
|
|
|
property var switchHandler : function(checked, index){
|
|
}
|
|
|
|
|
|
readonly property string interpretableSipAddress: SipAddressesModel.interpretSipAddress(
|
|
genSipAddress, false
|
|
)
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
signal entryClicked (var entry, var index)
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Header.
|
|
// ---------------------------------------------------------------------------
|
|
|
|
header: MouseArea {
|
|
height: {
|
|
var height = headerButton.visible ? SipAddressesViewStyle.header.button.height : 0
|
|
if (defaultContact.visible) {
|
|
height += SipAddressesViewStyle.entry.height
|
|
}
|
|
return height
|
|
}
|
|
width: parent.width
|
|
visible: sipAddressesView.genSipAddress
|
|
|
|
// Workaround to handle mouse.
|
|
// Without it, the mouse can be given to items list when mouse is hover header.
|
|
hoverEnabled: true
|
|
cursorShape: Qt.ArrowCursor
|
|
|
|
Column {
|
|
anchors.fill: parent
|
|
spacing: 0
|
|
|
|
// -----------------------------------------------------------------------
|
|
// Default contact.
|
|
// -----------------------------------------------------------------------
|
|
|
|
Loader {
|
|
id: defaultContact
|
|
|
|
height: SipAddressesViewStyle.entry.height
|
|
width: parent.width
|
|
|
|
visible: sipAddressesView.interpretableSipAddress.length > 0
|
|
|
|
sourceComponent: Rectangle {
|
|
anchors.fill: parent
|
|
color: SipAddressesViewStyle.entry.color.normal.color
|
|
|
|
RowLayout {
|
|
anchors {
|
|
fill: parent
|
|
rightMargin: SipAddressesViewStyle.entry.rightMargin
|
|
}
|
|
spacing: 0
|
|
|
|
Contact {
|
|
id: contact
|
|
|
|
Layout.fillHeight: true
|
|
Layout.fillWidth: true
|
|
|
|
entry: ({
|
|
sipAddress: sipAddressesView.interpretableSipAddress,
|
|
isOneToOne:true,
|
|
haveEncryption:false,
|
|
securityLevel:1
|
|
})
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
onClicked: sipAddressesView.entryClicked(contact.entry, -1)
|
|
}
|
|
}
|
|
|
|
ActionBar {
|
|
id: defaultContactActionBar
|
|
|
|
iconSize: SipAddressesViewStyle.entry.iconSize
|
|
|
|
Repeater {
|
|
model: sipAddressesView.actions
|
|
|
|
ActionButton {
|
|
isCustom: true
|
|
backgroundRadius: 90
|
|
colorSet: modelData.colorSet
|
|
|
|
visible: modelData.visible
|
|
|
|
onClicked: {
|
|
sipAddressesView.actions[index].handler({ // Do not use modelData on functions : Qt bug
|
|
sipAddress: sipAddressesView.interpretableSipAddress
|
|
})
|
|
}
|
|
Icon{
|
|
visible: modelData.secure>0 &&
|
|
// Do not use modelData on functions : Qt bug
|
|
(sipAddressesView.actions[index].secureIconVisibleHandler ? sipAddressesView.actions[index].secureIconVisibleHandler({ sipAddress : sipAddressesView.interpretableSipAddress}) : true)
|
|
icon: 'secure_on'
|
|
iconSize: parent.height/2
|
|
anchors.top:parent.top
|
|
anchors.horizontalCenter: parent.right
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
// Header button.
|
|
// -----------------------------------------------------------------------
|
|
|
|
MouseArea {
|
|
id: headerButton
|
|
|
|
height: SipAddressesViewStyle.header.button.height
|
|
width: parent.width
|
|
|
|
visible: sipAddressesView.showHeader && !!sipAddressesView.headerButtonAction
|
|
|
|
onClicked: sipAddressesView.headerButtonAction(sipAddressesView.interpretableSipAddress)
|
|
|
|
Rectangle {
|
|
anchors.fill: parent
|
|
color: parent.pressed
|
|
? SipAddressesViewStyle.header.color.pressed.color
|
|
: SipAddressesViewStyle.header.color.normal.color
|
|
|
|
Text {
|
|
anchors {
|
|
left: parent.left
|
|
leftMargin: SipAddressesViewStyle.header.leftMargin
|
|
verticalCenter: parent.verticalCenter
|
|
}
|
|
|
|
font {
|
|
bold: true
|
|
pointSize: SipAddressesViewStyle.header.text.pointSize
|
|
}
|
|
|
|
color: headerButton.pressed
|
|
? SipAddressesViewStyle.header.text.color.pressed.color
|
|
: SipAddressesViewStyle.header.text.color.normal.color
|
|
text: sipAddressesView.headerButtonDescription
|
|
}
|
|
|
|
Icon {
|
|
anchors {
|
|
right: parent.right
|
|
rightMargin: SipAddressesViewStyle.header.rightMargin
|
|
verticalCenter: parent.verticalCenter
|
|
}
|
|
|
|
icon: sipAddressesView.headerButtonIcon
|
|
iconSize: parent.height
|
|
overwriteColor: sipAddressesView.headerButtonOverwriteColor
|
|
|
|
visible: icon.length > 0
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Entries.
|
|
// ---------------------------------------------------------------------------
|
|
|
|
delegate: Rectangle {
|
|
id: sipAddressEntry
|
|
|
|
property var entry: $modelData
|
|
|
|
color: SipAddressesViewStyle.entry.color.normal.color
|
|
height: SipAddressesViewStyle.entry.height
|
|
width: parent ? parent.width : 0
|
|
|
|
Rectangle {
|
|
id: indicator
|
|
|
|
anchors.left: parent.left
|
|
color: 'transparent'
|
|
height: parent.height
|
|
width: SipAddressesViewStyle.entry.indicator.width
|
|
}
|
|
|
|
MouseArea {
|
|
id: mouseArea
|
|
|
|
anchors.fill: parent
|
|
cursorShape: Qt.ArrowCursor
|
|
|
|
RowLayout {
|
|
anchors {
|
|
fill: parent
|
|
rightMargin: SipAddressesViewStyle.entry.rightMargin
|
|
}
|
|
spacing: 0
|
|
|
|
// ---------------------------------------------------------------------
|
|
// Contact or address info.
|
|
// ---------------------------------------------------------------------
|
|
|
|
Contact {
|
|
Layout.fillHeight: true
|
|
Layout.fillWidth: true
|
|
showSubtitle: sipAddressesView.showSubtitle
|
|
|
|
entry: $modelData
|
|
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
onClicked: sipAddressesView.entryClicked($modelData, index)
|
|
}
|
|
}
|
|
|
|
|
|
// ---------------------------------------------------------------------
|
|
// Actions
|
|
// ---------------------------------------------------------------------
|
|
|
|
ActionBar {
|
|
iconSize: SipAddressesViewStyle.entry.iconSize
|
|
Loader {
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
width:50
|
|
|
|
sourceComponent: Component{
|
|
Switch{
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
width:50
|
|
//Layout.preferredWidth: 50
|
|
indicatorStyle: SwitchStyle.aux
|
|
|
|
visible: sipAddressesView.showSwitch
|
|
|
|
enabled:true
|
|
checked: false
|
|
onClicked: {
|
|
//checked = !checked
|
|
switchHandler(!checked, index)
|
|
}
|
|
}
|
|
}
|
|
active: sipAddressesView.showSwitch // Resolve a random Qt crash from using indicator on switch. This way, switch is not loaded.
|
|
// https://bugreports.qt.io/browse/QTBUG-82285.
|
|
}
|
|
Repeater {
|
|
model: sipAddressesView.actions
|
|
|
|
ActionButton {
|
|
isCustom: true
|
|
backgroundRadius: 90
|
|
colorSet: sipAddressesView.actions[index].colorSet
|
|
tooltipText:$modelData.tooltipText?$modelData.tooltipText:''
|
|
visible: sipAddressesView.actions[index].visible
|
|
onClicked: {// Do not use $modelData on functions : Qt bug
|
|
sipAddressesView.actions[index].handler(sipAddressEntry.entry)
|
|
}
|
|
Icon{
|
|
visible: sipAddressesView.actions[index].secure>0 &&
|
|
// Do not use $modelData on functions : Qt bug
|
|
(sipAddressesView.actions[index].secureIconVisibleHandler ? sipAddressesView.actions[index].secureIconVisibleHandler(sipAddressEntry.entry) : true)
|
|
icon: 'secure_on'
|
|
iconSize: parent.height/2
|
|
anchors.top:parent.top
|
|
anchors.horizontalCenter: parent.right
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
// Separator.
|
|
Rectangle {
|
|
color: SipAddressesViewStyle.entry.separator.colorModel.color
|
|
height: SipAddressesViewStyle.entry.separator.height
|
|
width: parent.width
|
|
visible: sipAddressesView.showSeparator
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
states: State {
|
|
when: mouseArea.containsMouse && sipAddressesView.isSelectable
|
|
|
|
PropertyChanges {
|
|
color: SipAddressesViewStyle.entry.color.hovered.color
|
|
target: sipAddressEntry
|
|
}
|
|
|
|
PropertyChanges {
|
|
color: SipAddressesViewStyle.entry.indicator.colorModel.color
|
|
target: indicator
|
|
}
|
|
}
|
|
}
|
|
}
|