mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-01-28 17:29:19 +00:00
369 lines
10 KiB
QML
369 lines
10 KiB
QML
import QtQuick 2.7
|
|
import QtQuick.Controls 2.2
|
|
import QtQuick.Layouts 1.3
|
|
import Qt.labs.platform 1.0
|
|
|
|
import Common 1.0
|
|
import Linphone 1.0
|
|
import Utils 1.0
|
|
|
|
import App.Styles 1.0
|
|
import ColorsList 1.0
|
|
|
|
import 'MainWindow.js' as Logic
|
|
|
|
// =============================================================================
|
|
|
|
ApplicationWindow {
|
|
id: window
|
|
|
|
property string _currentView
|
|
property var _lockedInfo
|
|
property SmartSearchBar mainSearchBar : (mainLoader.item ? mainLoader.item.mainSearchBar : null)
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
function lockView (info) {
|
|
Logic.lockView(info)
|
|
}
|
|
|
|
function unlockView () {
|
|
Logic.unlockView()
|
|
}
|
|
|
|
function setView (view, props, callback) {
|
|
Logic.setView(view, props, callback)
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Window properties.
|
|
// ---------------------------------------------------------------------------
|
|
|
|
minimumHeight: MainWindowStyle.minimumHeight
|
|
minimumWidth: MainWindowStyle.minimumWidth
|
|
|
|
title: Utils.capitalizeFirstLetter(Qt.application.name)
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
onActiveFocusItemChanged: Logic.handleActiveFocusItemChanged(activeFocusItem)
|
|
onClosing: Logic.handleClosing(close)
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
Connections {
|
|
target: CoreManager
|
|
onCoreManagerInitialized: mainLoader.active = true
|
|
}
|
|
|
|
Shortcut {
|
|
sequence: StandardKey.Close
|
|
onActivated: window.hide()
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
Loader {
|
|
id: mainLoader
|
|
|
|
active: false
|
|
anchors.fill: parent
|
|
|
|
sourceComponent: ColumnLayout {
|
|
// Workaround to get these properties in `MainWindow.js`.
|
|
readonly property alias contactsEntry: contactsEntry
|
|
readonly property alias contentLoader: contentLoader
|
|
//readonly property alias conferencesEntry: conferencesEntry
|
|
readonly property alias menu: menu
|
|
|
|
readonly property alias timeline: timeline
|
|
readonly property alias mainSearchBar: toolBar.mainSearchBar
|
|
|
|
spacing: 0
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
AuthenticationNotifier {
|
|
onAuthenticationRequested: Logic.handleAuthenticationRequested(authInfo, realm, sipAddress, userId)
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
// Toolbar properties.
|
|
// -----------------------------------------------------------------------
|
|
|
|
ToolBar {
|
|
id: toolBar
|
|
property alias mainSearchBar : smartSearchBar
|
|
Layout.fillWidth: true
|
|
Layout.preferredHeight: MainWindowStyle.toolBar.height
|
|
hoverEnabled : true
|
|
|
|
background: MainWindowStyle.toolBar.background
|
|
|
|
RowLayout {
|
|
anchors {
|
|
fill: parent
|
|
leftMargin: MainWindowStyle.toolBar.leftMargin
|
|
rightMargin: MainWindowStyle.toolBar.rightMargin
|
|
}
|
|
spacing: MainWindowStyle.toolBar.spacing
|
|
|
|
ActionButton {
|
|
icon: (leftPanel.visible?'panel_shown':'panel_hidden')
|
|
|
|
//: 'Hide Timeline' : Tooltip for a button that hide the timeline
|
|
tooltipText : (leftPanel.visible?qsTr('hideTimeline')
|
|
//: 'Open Timeline' : Tooltip for a button that open the timeline
|
|
:qsTr('openTimeline'))
|
|
iconSize: MainWindowStyle.panelButtonSize
|
|
//autoIcon: true
|
|
onClicked: leftPanel.visible = !leftPanel.visible
|
|
}
|
|
ActionButton {
|
|
isCustom: true
|
|
backgroundRadius: 4
|
|
colorSet: MainWindowStyle.buttons.home
|
|
//: 'Open Home' : Tooltip for a button that open the home view
|
|
tooltipText : qsTr('openHome')
|
|
//autoIcon: true
|
|
onClicked: setView('Home')
|
|
}
|
|
|
|
AccountStatus {
|
|
id: accountStatus
|
|
betterIcon:true
|
|
Layout.preferredHeight: parent.height
|
|
Layout.preferredWidth: MainWindowStyle.accountStatus.width
|
|
Layout.fillWidth: false
|
|
|
|
TooltipArea {
|
|
text: AccountSettingsModel.sipAddress
|
|
hoveringCursor: Qt.PointingHandCursor
|
|
}
|
|
|
|
onClicked: {
|
|
CoreManager.forceRefreshRegisters()
|
|
Logic.manageAccounts()
|
|
}
|
|
}
|
|
|
|
ColumnLayout {
|
|
Layout.preferredWidth: MainWindowStyle.autoAnswerStatus.width
|
|
visible: SettingsModel.autoAnswerStatus
|
|
|
|
Icon {
|
|
icon: SettingsModel.autoAnswerStatus
|
|
? 'auto_answer_custom'
|
|
: ''
|
|
iconSize: MainWindowStyle.autoAnswerStatus.iconSize
|
|
overwriteColor: MainWindowStyle.autoAnswerStatus.text.color
|
|
}
|
|
|
|
Text {
|
|
clip: true
|
|
color: MainWindowStyle.autoAnswerStatus.text.color
|
|
font {
|
|
bold: true
|
|
pointSize: MainWindowStyle.autoAnswerStatus.text.pointSize
|
|
}
|
|
text: qsTr('autoAnswerStatus')
|
|
visible: SettingsModel.autoAnswerStatus
|
|
width: parent.width
|
|
}
|
|
}
|
|
|
|
SmartSearchBar {
|
|
id: smartSearchBar
|
|
|
|
Layout.fillWidth: true
|
|
|
|
maxMenuHeight: MainWindowStyle.searchBox.maxHeight
|
|
placeholderText: qsTr('mainSearchBarPlaceholder')
|
|
tooltipText: qsTr('smartSearchBarTooltip')
|
|
|
|
onAddContact: window.setView('ContactEdit', {
|
|
sipAddress: sipAddress
|
|
})
|
|
|
|
onEntryClicked: {
|
|
if (SettingsModel.contactsEnabled) {
|
|
window.setView('ContactEdit', { sipAddress: entry })
|
|
} else {
|
|
CallsListModel.createChatRoom( '', false, [entry], true )
|
|
}
|
|
}
|
|
|
|
onLaunchCall: CallsListModel.launchAudioCall(sipAddress, '')
|
|
onLaunchChat: CallsListModel.launchChat( sipAddress,0 )
|
|
onLaunchSecureChat: CallsListModel.launchChat( sipAddress,1 )
|
|
onLaunchVideoCall: CallsListModel.launchVideoCall(sipAddress, '')
|
|
}
|
|
|
|
|
|
ActionButton {
|
|
isCustom: true
|
|
backgroundRadius: 4
|
|
colorSet: MainWindowStyle.buttons.newChatGroup
|
|
|
|
//: 'Open Conference' : Tooltip to illustrate a button
|
|
tooltipText : qsTr('newChatRoom')
|
|
visible: SettingsModel.standardChatEnabled || SettingsModel.secureChatEnabled
|
|
//autoIcon: true
|
|
onClicked: {
|
|
window.detachVirtualWindow()
|
|
window.attachVirtualWindow(Qt.resolvedUrl('Dialogs/NewChatRoom.qml')
|
|
,{})
|
|
}
|
|
}
|
|
|
|
ActionButton {
|
|
isCustom: true
|
|
backgroundRadius: 4
|
|
colorSet: MainWindowStyle.buttons.newConference
|
|
visible: SettingsModel.conferenceEnabled
|
|
tooltipText:qsTr('newConferenceButton')
|
|
//autoIcon: true
|
|
|
|
onClicked: Logic.openConferenceManager()
|
|
}
|
|
|
|
ActionButton {
|
|
isCustom: true
|
|
backgroundRadius: 4
|
|
colorSet: MainWindowStyle.buttons.burgerMenu
|
|
visible: Qt.platform.os !== 'osx'
|
|
|
|
onClicked: menuBar.open()
|
|
MainWindowMenuBar {
|
|
id: menuBar
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
Loader{
|
|
active:Qt.platform.os === 'osx'
|
|
sourceComponent:MainWindowTopMenuBar{}
|
|
}
|
|
// -----------------------------------------------------------------------
|
|
// Content.
|
|
// -----------------------------------------------------------------------
|
|
|
|
RowLayout {
|
|
Layout.fillHeight: true
|
|
Layout.fillWidth: true
|
|
|
|
spacing: 0
|
|
|
|
// Main menu.
|
|
ColumnLayout {
|
|
id:leftPanel
|
|
Layout.maximumWidth: MainWindowStyle.menu.width
|
|
Layout.preferredWidth: MainWindowStyle.menu.width
|
|
|
|
spacing: 0
|
|
|
|
ApplicationMenu {
|
|
id: menu
|
|
|
|
defaultSelectedEntry: null
|
|
|
|
entryHeight: MainWindowStyle.menu.height+10
|
|
entryWidth: MainWindowStyle.menu.width
|
|
|
|
ApplicationMenuEntry {
|
|
id: contactsEntry
|
|
|
|
icon: MainWindowStyle.menu.contacts.icon
|
|
iconSize: MainWindowStyle.menu.contacts.iconSize
|
|
overwriteColor: isSelected ? MainWindowStyle.menu.contacts.selectedColor : MainWindowStyle.menu.contacts.color
|
|
name: qsTr('contactsEntry')
|
|
visible: SettingsModel.contactsEnabled
|
|
|
|
onSelected: {
|
|
timeline.model.unselectAll()
|
|
setView('Contacts')
|
|
}
|
|
onClicked:{
|
|
setView('Contacts')
|
|
}
|
|
Icon{
|
|
anchors.right:parent.right
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
anchors.rightMargin: 10
|
|
icon: MainWindowStyle.menu.direction.icon
|
|
overwriteColor: contactsEntry.overwriteColor
|
|
iconSize: MainWindowStyle.menu.direction.iconSize
|
|
|
|
}
|
|
}
|
|
/*
|
|
ApplicationMenuEntry {
|
|
visible : false //TODO
|
|
id: conferencesEntry
|
|
|
|
icon: MainWindowStyle.menu.conferencesIcon
|
|
name: 'MES CONFERENCES'
|
|
overwriteColor: isSelected ? MainWindowStyle.menu.conferencesSelectedColor : MainWindowStyle.menu.conferencesColor
|
|
|
|
onSelected: window.setView('HistoryView')
|
|
}*/
|
|
}
|
|
|
|
// History.
|
|
Timeline {
|
|
id: timeline
|
|
|
|
Layout.fillHeight: true
|
|
Layout.fillWidth: true
|
|
model: TimelineProxyModel{}
|
|
|
|
onEntrySelected:{
|
|
if( entry ) {
|
|
window.setView('Conversation', {
|
|
chatRoomModel:entry.chatRoomModel
|
|
|
|
})
|
|
}else{
|
|
|
|
window.setView('Home', {})
|
|
}
|
|
menu.resetSelectedEntry()
|
|
}
|
|
onShowHistoryRequest: {
|
|
window.setView('HistoryView')
|
|
}
|
|
}
|
|
}
|
|
|
|
// Main content.
|
|
Loader {
|
|
id: contentLoader
|
|
|
|
objectName: '__contentLoader'
|
|
|
|
Layout.fillHeight: true
|
|
Layout.fillWidth: true
|
|
|
|
source: 'Home.qml'
|
|
Component.onCompleted: if (AccountSettingsModel.accounts.length < 2) source= 'Assistant.qml' // default proxy = 1. Do not use this set diretly in source because of bindings that will override next setSource
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
// Url handlers.
|
|
// ---------------------------------------------------------------------------
|
|
|
|
Connections {
|
|
target: UrlHandlers
|
|
|
|
onSip: window.setView('Conversation', {
|
|
peerAddress: sipAddress,
|
|
localAddress: AccountSettingsModel.sipAddress,
|
|
fullPeerAddress: sipAddress,
|
|
fullLocalAddress: AccountSettingsModel.fullSipAddress
|
|
})
|
|
}
|
|
}
|