blob: fac5b11aa5b3bd169b21ba5f1f292dbdcb038ebe [file] [log] [blame]
/*
* Copyright (C) 2020 by Savoir-faire Linux
* Author: Mingrui Zhang <mingrui.zhang@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 2.14
import QtQuick.Controls 2.14
import QtQuick.Layouts 1.14
import net.jami.Models 1.0
import "../../commoncomponents"
ComboBox {
id: accountComboBox
signal accountChanged(int index)
signal needToBackToWelcomePage(int index)
signal needToUpdateSmartList(string accountId)
signal newAccountButtonClicked
signal settingBtnClicked
currentIndex: 0
function backToWelcomePage(index) {
accountComboBox.needToBackToWelcomePage(index)
}
function updateSmartList(accountId) {
accountComboBox.needToUpdateSmartList(accountId)
}
/*
* Refresh every item in accountListModel.
*/
function updateAccountListModel() {
accountListModel.dataChanged(accountListModel.index(0, 0),
accountListModel.index(
accountListModel.rowCount() - 1, 0))
}
/*
* Reset accountListModel.
*/
function resetAccountListModel() {
accountListModel.reset()
}
Image {
id: userImageRoot
anchors.left: accountComboBox.left
anchors.leftMargin: 16
anchors.verticalCenter: accountComboBox.verticalCenter
width: 30
height: 30
fillMode: Image.PreserveAspectFit
/*
* Base 64 format
*/
source: {
if (currentIndex !== -1)
return "data:image/png;base64," + accountListModel.data(
accountListModel.index(
accountComboBox.currentIndex, 0), 259)
else
return source
}
mipmap: true
Rectangle {
id: presenseRect
anchors.right: userImageRoot.right
anchors.rightMargin: -2
anchors.bottom: userImageRoot.bottom
anchors.bottomMargin: -2
width: 12
height: 12
/*
* Visible when account is registered, enum REGISTERED == 5.
*/
visible: {
if (currentIndex !== -1)
return accountListModel.data(
accountListModel.index(
accountComboBox.currentIndex, 0), 261) === 5
else
return visible
}
Rectangle {
id: presenseCycle
anchors.centerIn: presenseRect
width: 10
height: 10
radius: 30
color: JamiTheme.presenceGreen
}
radius: 30
color: JamiTheme.backgroundColor
}
}
Text {
id: textUserAliasRoot
anchors.left: userImageRoot.right
anchors.leftMargin: 16
anchors.top: rootItemBackground.top
anchors.topMargin: 16
text: textMetricsUserAliasRoot.elidedText
font.pointSize: JamiTheme.textFontSize
}
Image {
anchors.left: textUserAliasRoot.right
anchors.verticalCenter: textUserAliasRoot.verticalCenter
width: 24
height: 24
fillMode: Image.PreserveAspectFit
mipmap: true
source: "qrc:/images/icons/round-arrow_drop_down-24px.svg"
}
Text {
id: textUsernameRoot
anchors.left: userImageRoot.right
anchors.leftMargin: 16
anchors.top: textUserAliasRoot.bottom
text: textMetricsUsernameRoot.elidedText
font.pointSize: JamiTheme.textFontSize
color: JamiTheme.faddedLastInteractionFontColor
}
TextMetrics {
id: textMetricsUserAliasRoot
font: textUserAliasRoot.font
elide: Text.ElideRight
elideWidth: accountComboBox.width - userImageRoot.width - settingsButton.width - qrCodeGenerateButton.width - 55
/*
* Role::Alias
*/
text: {
if (currentIndex !== -1)
return accountListModel.data(accountListModel.index(
accountComboBox.currentIndex,
0), 257)
else
return text
}
}
TextMetrics {
id: textMetricsUsernameRoot
font: textUsernameRoot.font
elide: Text.ElideRight
elideWidth: accountComboBox.width - userImageRoot.width - settingsButton.width - qrCodeGenerateButton.width - 55
/*
* Role::Username
*/
text: {
if (currentIndex !== -1)
return accountListModel.data(accountListModel.index(
accountComboBox.currentIndex,
0), 258)
else
return text
}
}
HoverableButton {
id: qrCodeGenerateButton
anchors.right: settingsButton.left
anchors.rightMargin: 10
anchors.verticalCenter: accountComboBox.verticalCenter
buttonImageHeight: height - 8
buttonImageWidth: width - 8
radius: height / 2
width: 24
height: 24
source: "qrc:/images/qrcode.png"
backgroundColor: "white"
onClicked: {
qrDialog.open()
}
}
HoverableButton {
id: settingsButton
anchors.right: accountComboBox.right
anchors.rightMargin: 10
anchors.verticalCenter: accountComboBox.verticalCenter
buttonImageHeight: height - 8
buttonImageWidth: width - 8
radius: height / 2
width: 25
height: 25
source: !mainViewWindow.inSettingsView ? "qrc:/images/icons/round-settings-24px.svg" :
"qrc:/images/icons/round-close-24px.svg"
backgroundColor: "white"
onClicked: {
settingBtnClicked()
}
}
background: Rectangle {
id: rootItemBackground
implicitWidth: accountComboBox.width
implicitHeight: accountComboBox.height
color: JamiTheme.backgroundColor
}
MouseArea {
id: comboBoxRootMouseArea
anchors.fill: parent
hoverEnabled: true
propagateComposedEvents: true
onPressed: {
if (isMouseOnButton(mouse, qrCodeGenerateButton)) {
qrCodeGenerateButton.backgroundColor = JamiTheme.pressColor
qrCodeGenerateButton.clicked()
}if (isMouseOnButton(mouse, settingsButton)) {
settingsButton.backgroundColor = JamiTheme.pressColor
settingsButton.clicked()
} else {
rootItemBackground.color = JamiTheme.pressColor
}
}
onReleased: {
if (isMouseOnButton(mouse, qrCodeGenerateButton)) {
qrCodeGenerateButton.backgroundColor = JamiTheme.releaseColor
} else if (isMouseOnButton(mouse, settingsButton)) {
settingsButton.backgroundColor = JamiTheme.releaseColor
} else {
rootItemBackground.color = JamiTheme.releaseColor
if (comboBoxPopup.opened) {
accountComboBox.popup.close()
} else {
accountComboBox.popup.open()
}
}
}
onEntered: {
rootItemBackground.color = JamiTheme.hoverColor
}
onExited: {
rootItemBackground.color = JamiTheme.backgroundColor
}
onMouseXChanged: {
/*
* Manually making button hover.
*/
qrCodeGenerateButton.backgroundColor = (isMouseOnButton(mouse, qrCodeGenerateButton)) ?
JamiTheme.hoverColor : "white"
settingsButton.backgroundColor = (isMouseOnButton(mouse, settingsButton)) ?
JamiTheme.hoverColor : "white"
}
function isMouseOnButton(mouse, button) {
var mousePos = mapToItem(comboBoxRootMouseArea, mouse.x, mouse.y)
var qrButtonPos = mapToItem(comboBoxRootMouseArea,
button.x,
button.y)
if ((mousePos.x >= qrButtonPos.x
&& mousePos.x <= qrButtonPos.x + button.width)
&& (mousePos.y >= qrButtonPos.y
&& mousePos.y <= qrButtonPos.y + button.height))
return true
return false
}
}
indicator: null
/*
* Overwrite the combo box pop up to add footer (for add accounts).
*/
popup: AccountComboBoxPopup {
id: comboBoxPopup
onAccountNeedToChange: {
accountComboBox.accountChanged(index)
}
onNewAccountButtonClicked: {
accountComboBox.newAccountButtonClicked()
}
}
}