client-qml: add initial commit
Change-Id: I32bfdd2a618aa7ac6181da2697e241667b010aab
diff --git a/src/settingsview/components/CurrentAccountSettingsScrollPage.qml b/src/settingsview/components/CurrentAccountSettingsScrollPage.qml
new file mode 100644
index 0000000..b3d4392
--- /dev/null
+++ b/src/settingsview/components/CurrentAccountSettingsScrollPage.qml
@@ -0,0 +1,1376 @@
+/*
+ * Copyright (C) 2019-2020 by Savoir-faire Linux
+ * Author: Yang Wang <yang.wang@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 <http://www.gnu.org/licenses/>.
+ */
+
+import QtQuick 2.15
+import QtQuick.Window 2.14
+import QtQuick.Controls 2.14
+import QtQuick.Controls.Universal 2.12
+import QtQuick.Layouts 1.3
+import QtGraphicalEffects 1.14
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Dialogs 1.3
+import Qt.labs.platform 1.1
+import net.jami.Models 1.0
+
+import "../../commoncomponents"
+
+Rectangle {
+ id: accountViewRect
+
+ enum RegName {
+ BLANK,
+ INVALIDFORM,
+ TAKEN,
+ FREE,
+ SEARCHING
+ }
+
+ property int regNameUi: CurrentAccountSettingsScrollPage.BLANK
+ property string registeredName: ""
+ property bool registeredIdNeedsSet: false
+
+ property int refreshVariable : 0
+
+ signal navigateToMainView
+ signal navigateToNewWizardView
+
+ function refreshRelevantUI(){
+ refreshVariable++
+ refreshVariable--
+ }
+
+ Connections {
+ id: btnRegisterNameClickConnection
+ target: btnRegisterName
+
+ enabled: {
+ refreshVariable
+ switch (regNameUi) {
+ case CurrentAccountSettingsScrollPage.FREE:
+ return true
+ default:
+ return false
+ }
+ }
+
+ function onClicked() {
+ slotRegisterName()
+ }
+ }
+
+ function updateAccountInfoDisplayed() {
+ setAvatar()
+
+ accountEnableCheckBox.checked = ClientWrapper.settingsAdaptor.get_CurrentAccountInfo_Enabled()
+ displayNameLineEdit.text = ClientWrapper.settingsAdaptor.getCurrentAccount_Profile_Info_Alias()
+
+ var showLocalAccountConfig = (ClientWrapper.settingsAdaptor.getAccountConfig_Manageruri() === "")
+ passwdPushButton.visible = showLocalAccountConfig
+ btnExportAccount.visible = showLocalAccountConfig
+ linkDevPushButton.visible = showLocalAccountConfig
+
+ registeredIdNeedsSet = (ClientWrapper.settingsAdaptor.get_CurrentAccountInfo_RegisteredName() === "")
+
+ if(!registeredIdNeedsSet){
+ currentRegisteredID.text = ClientWrapper.settingsAdaptor.get_CurrentAccountInfo_RegisteredName()
+ } else {
+ currentRegisteredID.text = ""
+ }
+
+ currentRingID.text = ClientWrapper.settingsAdaptor.getCurrentAccount_Profile_Info_Uri()
+
+ // update device list view
+ updateAndShowDevicesSlot()
+
+ bannedContactsListWidget.visible = false
+ bannedContactsLayoutWidget.visible = (bannedListModel.rowCount() > 0)
+
+ if (advanceSettingsView.visible) {
+ advanceSettingsView.updateAccountInfoDisplayedAdvance()
+ }
+ refreshRelevantUI()
+ }
+
+ function connectCurrentAccount() {
+ accountConnections_ContactModel.enabled = true
+ accountConnections_DeviceModel.enabled = true
+ }
+
+ function disconnectAccountConnections() {
+ accountConnections_ContactModel.enabled = false
+ accountConnections_DeviceModel.enabled = false
+ }
+
+ function isPhotoBoothOpened() {
+ return currentAccountAvatar.takePhotoState
+ }
+
+ function setAvatar() {
+ currentAccountAvatar.setAvatarPixmap(
+ ClientWrapper.settingsAdaptor.getAvatarImage_Base64(
+ currentAccountAvatar.boothWidht),
+ ClientWrapper.settingsAdaptor.getIsDefaultAvatar())
+ }
+
+ function stopBooth() {
+ currentAccountAvatar.stopBooth()
+ }
+
+ function toggleBannedContacts(){
+ var bannedContactsVisible = bannedContactsListWidget.visible
+ bannedContactsListWidget.visible = !bannedContactsVisible
+ updateAndShowBannedContactsSlot()
+ }
+
+ function unban(index){
+ ClientWrapper.settingsAdaptor.unbanContact(index)
+ updateAndShowBannedContactsSlot()
+ }
+
+ Connections {
+ id: accountConnections_ContactModel
+ target: ClientWrapper.contactModel
+
+ function onModelUpdated(uri, needsSorted) {
+ updateAndShowBannedContactsSlot()
+ }
+
+ function onContactAdded(contactUri){
+ updateAndShowBannedContactsSlot()
+ }
+
+ function onContactRemoved(contactUri){
+ updateAndShowBannedContactsSlot()
+ }
+ }
+
+ Connections {
+ id: accountConnections_DeviceModel
+ target: ClientWrapper.deviceModel
+
+ function onDeviceAdded(id) {
+ updateAndShowDevicesSlot()
+ }
+
+ function onDeviceRevoked(id, status) {
+ updateAndShowDevicesSlot()
+ }
+
+ function onDeviceUpdated(id) {
+ updateAndShowDevicesSlot()
+ }
+ }
+
+ // slots
+ function verifyRegisteredNameSlot() {
+ if (ClientWrapper.settingsAdaptor.get_CurrentAccountInfo_RegisteredName() !== "") {
+ regNameUi = CurrentAccountSettingsScrollPage.BLANK
+ } else {
+ registeredName = ClientWrapper.utilsAdaptor.stringSimplifier(
+ currentRegisteredID.text)
+ if (registeredName !== "") {
+ if (ClientWrapper.utilsAdaptor.validateRegNameForm(registeredName)) {
+ regNameUi = CurrentAccountSettingsScrollPage.SEARCHING
+ lookUpLabelTimer.restart()
+ } else {
+ regNameUi = CurrentAccountSettingsScrollPage.INVALIDFORM
+ }
+ } else {
+ regNameUi = CurrentAccountSettingsScrollPage.BLANK
+ }
+ }
+ }
+
+ Timer {
+ id: lookUpLabelTimer
+
+ interval: 300
+ onTriggered: {
+ beforeNameLookup()
+ }
+ }
+
+ function beforeNameLookup() {
+ ClientWrapper.nameDirectory.lookupName("", registeredName)
+ }
+
+ Connections {
+ target: ClientWrapper.nameDirectory
+ enabled: true
+
+ function onRegisteredNameFound(status, address, name) {
+ afterNameLookup(status, name)
+ }
+ }
+
+ function afterNameLookup(status, regName) {
+ if (registeredName === regName && regName.length > 2) {
+ switch (status) {
+ case NameDirectory.LookupStatus.NOT_FOUND:
+ regNameUi = CurrentAccountSettingsScrollPage.FREE
+ break
+ default:
+ regNameUi = CurrentAccountSettingsScrollPage.TAKEN
+ break
+ }
+ } else {
+ regNameUi = CurrentAccountSettingsScrollPage.BLANK
+ }
+ }
+
+ function setAccEnableSlot(state) {
+ ClientWrapper.accountModel.setAccountEnabled(ClientWrapper.utilsAdaptor.getCurrAccId(), state)
+ }
+
+ /*
+ * JamiFileDialog for exporting account
+ */
+ JamiFileDialog {
+ id: exportBtn_Dialog
+
+ mode: JamiFileDialog.SaveFile
+
+ title: qsTr("Export Account Here")
+ folder: StandardPaths.writableLocation(StandardPaths.DesktopLocation)
+
+ nameFilters: [qsTr("Jami archive files") + " (*.gz)", qsTr(
+ "All files") + " (*)"]
+
+ onAccepted: {
+ // is there password? If so, go to password dialog, else, go to following directly
+ var exportPath = ClientWrapper.utilsAdaptor.getAbsPath(file.toString())
+ if (ClientWrapper.accountAdaptor.hasPassword()) {
+ passwordDialog.openDialog(PasswordDialog.ExportAccount,exportPath)
+ return
+ } else {
+ if (exportPath.length > 0) {
+ var isSuccessful = ClientWrapper.accountAdaptor.accoundModel().exportToFile(ClientWrapper.utilsAdaptor.getCurrAccId(), exportPath,"")
+ var title = isSuccessful ? qsTr("Success") : qsTr("Error")
+ var iconMode = isSuccessful ? StandardIcon.Information : StandardIcon.Critical
+ var info = isSuccessful ? qsTr("Export Successful") : qsTr("Export Failed")
+ msgDialog.openWithParameters(title,info, iconMode, StandardButton.Ok)
+ }
+ }
+ }
+
+ onRejected: {}
+
+ onVisibleChanged: {
+ if (!visible) {
+ rejected()
+ }
+ }
+ }
+
+ function exportAccountSlot() {
+ exportBtn_Dialog.open()
+ }
+
+ PasswordDialog {
+ id: passwordDialog
+
+ onDoneSignal: {
+ var success = (code === successCode)
+ var title = success ? qsTr("Success") : qsTr("Error")
+ var iconMode = success ? StandardIcon.Information : StandardIcon.Critical
+
+ var info
+ switch(currentPurpose){
+ case PasswordDialog.ExportAccount:
+ info = success ? qsTr("Export Successful") : qsTr("Export Failed")
+ break
+ case PasswordDialog.ChangePassword:
+ info = success ? qsTr("Password Changed Successfully") : qsTr("Password Change Failed")
+ break
+ case PasswordDialog.SetPassword:
+ info = success ? qsTr("Password Set Successfully") : qsTr("Password Set Failed")
+ passwdPushButton.text = success ? qsTr("Change Password") : qsTr("Set Password")
+ break
+ }
+
+ msgDialog.openWithParameters(title,info, iconMode, StandardButton.Ok)
+ }
+ }
+
+ MessageBox {
+ id: msgDialog
+ }
+
+ function passwordClicked() {
+ if (ClientWrapper.accountAdaptor.hasPassword()){
+ passwordDialog.openDialog(PasswordDialog.ChangePassword)
+ } else {
+ passwordDialog.openDialog(PasswordDialog.SetPassword)
+ }
+ }
+
+ function delAccountSlot() {
+ deleteAccountDialog.open()
+ }
+
+ DeleteAccountDialog{
+ id: deleteAccountDialog
+
+ anchors.centerIn: parent.Center
+ x: (parent.width - width) / 2
+ y: (parent.height - height) / 2
+
+ onAccepted: {
+ ClientWrapper.accountAdaptor.setSelectedAccountId()
+ ClientWrapper.accountAdaptor.setSelectedConvId()
+
+ if(ClientWrapper.utilsAdaptor.getAccountListSize() > 0){
+ navigateToMainView()
+ } else {
+ navigateToNewWizardView()
+ }
+ }
+ }
+
+ NameRegistrationDialog{
+ id : nameRegistrationDialog
+
+ onAccepted: {
+ registeredIdNeedsSet = false
+ }
+ }
+
+ function slotRegisterName() {
+ refreshRelevantUI()
+ nameRegistrationDialog.openNameRegistrationDialog(registeredName)
+ }
+
+ LinkDeviceDialog{
+ id: linkDeviceDialog
+
+ onAccepted: {
+ updateAndShowDevicesSlot()
+ }
+ }
+
+ function showLinkDevSlot() {
+ linkDeviceDialog.openLinkDeviceDialog()
+ }
+
+ RevokeDevicePasswordDialog{
+ id: revokeDevicePasswordDialog
+
+ onRevokeDeviceWithPassword:{
+ revokeDeviceWithIDAndPassword(idOfDevice, password)
+ }
+ }
+
+ MessageBox{
+ id: revokeDeviceMessageBox
+
+ property string idOfDev: ""
+
+ title:qsTr("Remove Device")
+ text :qsTr("Are you sure you wish to remove this device?")
+ icon :StandardIcon.Information
+ standardButtons: StandardButton.Ok | StandardButton.Cancel
+
+ onYes: {
+ accepted()
+ }
+
+ onNo:{
+ rejected()
+ }
+
+ onDiscard: {
+ rejected()
+ }
+
+ onAccepted: {
+ revokeDeviceWithIDAndPassword(idOfDev,"")
+ }
+
+ onRejected: {}
+ }
+
+ function removeDeviceSlot(index){
+ var idOfDevice = deviceItemListModel.data(deviceItemListModel.index(index,0), DeviceItemListModel.DeviceID)
+ if(ClientWrapper.accountAdaptor.hasPassword()){
+ revokeDevicePasswordDialog.openRevokeDeviceDialog(idOfDevice)
+ } else {
+ revokeDeviceMessageBox.idOfDev = idOfDevice
+ revokeDeviceMessageBox.open()
+ }
+ }
+
+ function revokeDeviceWithIDAndPassword(idDevice, password){
+ ClientWrapper.deviceModel.revokeDevice(idDevice, password)
+ updateAndShowDevicesSlot()
+ }
+
+ function updateAndShowBannedContactsSlot() {
+ if(bannedListModel.rowCount() <= 0){
+ bannedContactsLayoutWidget.visible = false
+ return
+ }
+
+ bannedListModel.reset()
+ }
+
+ function updateAndShowDevicesSlot() {
+ if(ClientWrapper.settingsAdaptor.getAccountConfig_Manageruri() === ""){
+ linkDevPushButton.visible = true
+ }
+
+ deviceItemListModel.reset()
+ }
+
+ DeviceItemListModel {
+ id: deviceItemListModel
+ }
+
+ BannedListModel{
+ id: bannedListModel
+ }
+
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+
+ ColumnLayout {
+ anchors.fill: parent
+ spacing: 0
+
+ Item {
+ Layout.fillWidth: true
+
+ Layout.maximumHeight: 10
+ Layout.minimumHeight: 10
+ Layout.preferredHeight: 10
+
+ Layout.alignment: Qt.AlignTop
+ }
+
+ RowLayout {
+ spacing: 6
+
+ Layout.alignment: Qt.AlignTop
+
+ Layout.fillWidth: true
+ Layout.maximumHeight: 30
+ Layout.minimumHeight: 30
+ Layout.preferredHeight: accountPageTitle.height
+
+ Item {
+ Layout.fillHeight: true
+
+ Layout.maximumWidth: 30
+ Layout.preferredWidth: 30
+ Layout.minimumWidth: 30
+ }
+
+ Label {
+ id: accountPageTitle
+
+ Layout.preferredWidth: 117
+
+ Layout.maximumHeight: 25
+ Layout.preferredHeight: 25
+ Layout.minimumHeight: 25
+
+ text: qsTr("Jami Account")
+
+ font.pointSize: 15
+ font.kerning: true
+
+ horizontalAlignment: Text.AlignLeft
+ verticalAlignment: Text.AlignVCenter
+ }
+
+ Item {
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ }
+ }
+
+ ScrollView {
+ id: accoutScrollView
+
+ property ScrollBar hScrollBar: ScrollBar.horizontal
+ property ScrollBar vScrollBar: ScrollBar.vertical
+
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+
+ ScrollBar.horizontal.policy: ScrollBar.AsNeeded
+ ScrollBar.vertical.policy: ScrollBar.AsNeeded
+
+ font.pointSize: 8
+ font.kerning: true
+ clip: true
+
+ ColumnLayout {
+ id: accoutnViewLayout
+
+ Layout.fillHeight: true
+ Layout.maximumWidth: 625
+
+ Item {
+ Layout.fillHeight: true
+
+ Layout.maximumWidth: 30
+ Layout.preferredWidth: 30
+ Layout.minimumWidth: 30
+ }
+
+ ColumnLayout {
+ spacing: 6
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+
+ Layout.leftMargin: 30
+
+ Item {
+ Layout.fillHeight: true
+
+ Layout.maximumWidth: 24
+ Layout.preferredWidth: 24
+ Layout.minimumWidth: 24
+ }
+
+ ToggleSwitch {
+ id: accountEnableCheckBox
+
+ labelText: qsTr("Enable")
+ fontPointSize: 11
+
+ onSwitchToggled: {
+ setAccEnableSlot(checked)
+ }
+ }
+
+ Item {
+ Layout.fillHeight: true
+
+ Layout.maximumWidth: 20
+ Layout.preferredWidth: 20
+ Layout.minimumWidth: 20
+ }
+
+ ColumnLayout {
+ Layout.fillWidth: true
+
+ Label {
+ Layout.fillWidth: true
+
+ Layout.maximumHeight: 21
+ Layout.preferredHeight: 21
+ Layout.minimumHeight: 21
+
+ text: qsTr("Profile")
+ font.pointSize: 13
+ font.kerning: true
+
+ horizontalAlignment: Text.AlignLeft
+ verticalAlignment: Text.AlignVCenter
+ }
+
+ Item {
+ Layout.fillWidth: true
+
+ Layout.maximumHeight: 10
+ Layout.preferredHeight: 10
+ Layout.minimumHeight: 10
+ }
+
+ ColumnLayout {
+ Layout.fillWidth: true
+ layoutDirection: Qt.LeftToRight
+
+ spacing: 6
+
+ PhotoboothView {
+ id: currentAccountAvatar
+
+ Layout.alignment: Qt.AlignHCenter
+
+ Layout.maximumWidth: 261
+ Layout.preferredWidth: 261
+ Layout.minimumWidth: 261
+ Layout.maximumHeight: 261
+ Layout.preferredHeight: 261
+ Layout.minimumHeight: 261
+
+ Layout.leftMargin: 20
+
+ onImageAcquired: {
+ ClientWrapper.settingsAdaptor.setCurrAccAvatar(imgBase64)
+ }
+
+ onImageCleared: {
+ ClientWrapper.settingsAdaptor.clearCurrentAvatar()
+ setAvatar()
+ }
+ }
+
+ InfoLineEdit {
+ id: displayNameLineEdit
+
+ fieldLayoutWidth: 261
+
+ Layout.leftMargin: 20
+
+ font.pointSize: 10
+ font.kerning: true
+
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+
+ onEditingFinished: {
+ ClientWrapper.accountAdaptor.setCurrAccDisplayName(
+ displayNameLineEdit.text)
+ }
+ }
+ }
+ }
+
+ Item {
+ Layout.fillHeight: true
+
+ Layout.maximumWidth: 20
+ Layout.preferredWidth: 20
+ Layout.minimumWidth: 20
+ }
+
+ ColumnLayout {
+ Layout.fillWidth: true
+
+ Label {
+ Layout.fillWidth: true
+
+ Layout.maximumHeight: 21
+ Layout.preferredHeight: 21
+ Layout.minimumHeight: 21
+
+ text: qsTr("Identity")
+ font.pointSize: 13
+ font.kerning: true
+
+ horizontalAlignment: Text.AlignLeft
+ verticalAlignment: Text.AlignVCenter
+ }
+
+ Item {
+ Layout.fillHeight: true
+
+ Layout.maximumWidth: 10
+ Layout.preferredWidth: 10
+ Layout.minimumWidth: 10
+ }
+
+ ColumnLayout {
+ spacing: 7
+
+ Layout.fillWidth: true
+
+ RowLayout {
+ spacing: 6
+ Layout.fillWidth: true
+ Layout.maximumHeight: 30
+
+ Layout.leftMargin: 20
+
+ Layout.maximumWidth: 625
+
+ Label {
+ Layout.maximumWidth: 13
+ Layout.preferredWidth: 13
+ Layout.minimumWidth: 13
+
+ Layout.minimumHeight: 30
+ Layout.preferredHeight: 30
+ Layout.maximumHeight: 30
+
+ text: qsTr("Id")
+ font.pointSize: 10
+ font.kerning: true
+
+ horizontalAlignment: Text.AlignLeft
+ verticalAlignment: Text.AlignVCenter
+ }
+
+ TextField {
+ id: currentRingID
+
+ property var backgroundColor: "transparent"
+ property var borderColor: "transparent"
+
+ Layout.fillWidth: true
+
+ Layout.minimumHeight: 30
+ Layout.preferredHeight: 30
+ Layout.maximumHeight: 30
+
+ font.pointSize: 10
+ font.kerning: true
+ font.bold: true
+
+ readOnly: true
+ selectByMouse: true
+
+ text: { refreshVariable
+ return ClientWrapper.settingsAdaptor.getCurrentAccount_Profile_Info_Uri()}
+
+ horizontalAlignment: Text.AlignLeft
+ verticalAlignment: Text.AlignVCenter
+
+ background: Rectangle {
+ anchors.fill: parent
+ radius: 0
+ border.color: currentRingID.borderColor
+ border.width: 0
+ color: currentRingID.backgroundColor
+ }
+ }
+ }
+
+ RowLayout {
+ spacing: 6
+ Layout.fillWidth: true
+ Layout.maximumHeight: 32
+
+ Layout.leftMargin: 20
+
+ layoutDirection: Qt.LeftToRight
+
+ Label {
+ id: lblRegisteredName
+
+ Layout.maximumWidth: 127
+ Layout.preferredWidth: 127
+ Layout.minimumWidth: 127
+
+ Layout.minimumHeight: 32
+ Layout.preferredHeight: 32
+ Layout.maximumHeight: 32
+
+ text: qsTr("Registered name")
+
+ font.pointSize: 10
+ font.kerning: true
+
+ horizontalAlignment: Text.AlignLeft
+ verticalAlignment: Text.AlignVCenter
+ }
+
+ RowLayout {
+ spacing: 6
+ Layout.fillWidth: true
+ Layout.maximumHeight: 30
+ Layout.alignment: Qt.AlignVCenter
+
+ TextField {
+ id: currentRegisteredID
+
+ Layout.maximumWidth: 300
+ Layout.preferredWidth: 300
+ Layout.minimumWidth: 300
+
+ Layout.minimumHeight: 30
+ Layout.preferredHeight: 30
+ Layout.maximumHeight: 30
+
+ placeholderText: { refreshVariable
+ var result = registeredIdNeedsSet ? qsTr("Type here to register a username") : ""
+ return result}
+
+ text: {
+ refreshVariable
+ if (!registeredIdNeedsSet){
+ return ClientWrapper.settingsAdaptor.get_CurrentAccountInfo_RegisteredName()
+ } else {
+ return ""
+ }
+ }
+ selectByMouse: true
+ readOnly: { refreshVariable
+ return !registeredIdNeedsSet}
+
+ font.pointSize: 10
+ font.kerning: true
+ font.bold: { refreshVariable
+ return !registeredIdNeedsSet}
+
+ horizontalAlignment: Text.AlignLeft
+ verticalAlignment: Text.AlignVCenter
+
+ background: Rectangle {
+ anchors.fill: parent
+ radius: {refreshVariable
+ var result = registeredIdNeedsSet ? height / 2 : 0
+ return result}
+ border.color: "transparent"
+ border.width: {refreshVariable
+ var result = registeredIdNeedsSet ? 2 : 0
+ return result}
+ color: {refreshVariable
+ var result = registeredIdNeedsSet ? Qt.rgba(
+ 240 / 256, 240 / 256,
+ 240 / 256,
+ 1.0) : "transparent"
+ return result}
+ }
+
+ onTextEdited: {
+ verifyRegisteredNameSlot()
+ }
+
+ onEditingFinished: {
+ verifyRegisteredNameSlot()
+ }
+ }
+
+ LookupStatusLabel {
+ id: lookupStatusLabel
+
+ visible:{refreshVariable
+ var result = registeredIdNeedsSet
+ && (regNameUi
+ !== CurrentAccountSettingsScrollPage.BLANK)
+ return result}
+
+ MouseArea {
+ id: lookupStatusLabelArea
+ anchors.fill: parent
+ property bool isHovering: false
+
+ onEntered: isHovering = true
+ onExited: isHovering = false
+
+ hoverEnabled: true
+ }
+
+ ToolTip.visible: lookupStatusLabelArea.isHovering
+ ToolTip.text: {
+ switch (regNameUi) {
+ case CurrentAccountSettingsScrollPage.BLANK:
+ return qsTr("")
+ case CurrentAccountSettingsScrollPage.INVALIDFORM:
+ return qsTr("A registered name should not have any spaces and must be at least three letters long")
+ case CurrentAccountSettingsScrollPage.TAKEN:
+ return qsTr("This name is already taken")
+ case CurrentAccountSettingsScrollPage.FREE:
+ return qsTr("Register this name")
+ case CurrentAccountSettingsScrollPage.SEARCHING:
+ return qsTr("")
+ default:
+ return qsTr("")
+ }
+ }
+
+ lookupStatusState: {
+ switch (regNameUi) {
+ case CurrentAccountSettingsScrollPage.BLANK:
+ return "Blank"
+ case CurrentAccountSettingsScrollPage.INVALIDFORM:
+ return "Invalid"
+ case CurrentAccountSettingsScrollPage.TAKEN:
+ return "Taken"
+ case CurrentAccountSettingsScrollPage.FREE:
+ return "Free"
+ case CurrentAccountSettingsScrollPage.SEARCHING:
+ return "Searching"
+ default:
+ return "Blank"
+ }
+ }
+ }
+
+ HoverableRadiusButton {
+ id: btnRegisterName
+
+ visible: {refreshVariable
+ var result = registeredIdNeedsSet
+ && (regNameUi
+ === CurrentAccountSettingsScrollPage.FREE)
+ return result}
+
+ Layout.maximumWidth: 80
+ Layout.preferredWidth: 80
+ Layout.minimumWidth: 80
+
+ Layout.minimumHeight: 30
+ Layout.preferredHeight: 30
+ Layout.maximumHeight: 30
+
+ text: qsTr("Register")
+ font.pointSize: 10
+ font.kerning: true
+
+ radius: height / 2
+ }
+
+ Item {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ }
+ }
+ }
+
+ RowLayout {
+ spacing: 6
+ Layout.fillWidth: true
+ Layout.maximumHeight: 30
+
+ Layout.leftMargin: 20
+
+ HoverableButtonTextItem {
+ id: passwdPushButton
+
+ visible: ClientWrapper.settingsAdaptor.getAccountConfig_Manageruri() === ""
+
+ Layout.maximumWidth: 261
+ Layout.preferredWidth: 261
+ Layout.minimumWidth: 261
+
+ Layout.minimumHeight: 30
+ Layout.preferredHeight: 30
+ Layout.maximumHeight: 30
+ text: ClientWrapper.accountAdaptor.hasPassword() ? qsTr("Change Password") : qsTr("Set Password")
+
+ font.pointSize: 10
+ font.kerning: true
+
+ radius: height / 2
+
+ onClicked: {
+ passwordClicked()
+ }
+ }
+
+ Item {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ }
+ }
+
+ RowLayout {
+ spacing: 6
+ Layout.fillWidth: true
+ Layout.maximumHeight: 30
+
+ Layout.leftMargin: 20
+
+ HoverableButtonTextItem {
+ id: btnExportAccount
+
+ visible: ClientWrapper.settingsAdaptor.getAccountConfig_Manageruri() === ""
+
+ Layout.maximumWidth: 261
+ Layout.preferredWidth: 261
+ Layout.minimumWidth: 261
+
+ Layout.minimumHeight: 30
+ Layout.preferredHeight: 30
+ Layout.maximumHeight: 30
+
+ text: qsTr("Export Account")
+ font.pointSize: 10
+ font.kerning: true
+
+ radius: height / 2
+
+ onClicked: {
+ exportAccountSlot()
+ }
+ }
+
+ Item {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ }
+ }
+
+ RowLayout {
+ spacing: 6
+ Layout.fillWidth: true
+ Layout.maximumHeight: 30
+
+ Layout.leftMargin: 20
+
+ HoverableButtonTextItem {
+ id: btnDeletAccount
+
+ backgroundColor: "red"
+ onEnterColor: Qt.rgba(150 / 256, 0, 0, 0.7)
+ onDisabledBackgroundColor: Qt.rgba(
+ 255 / 256,
+ 0, 0, 0.8)
+ onPressColor: backgroundColor
+ textColor: "white"
+
+ Layout.maximumWidth: 261
+ Layout.preferredWidth: 261
+ Layout.minimumWidth: 261
+
+ Layout.minimumHeight: 30
+ Layout.preferredHeight: 30
+ Layout.maximumHeight: 30
+
+ text: qsTr("Delete Account")
+ font.pointSize: 10
+ font.kerning: true
+
+ radius: height / 2
+
+ onClicked: {
+ delAccountSlot()
+ }
+ }
+
+ Item {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ }
+ }
+ }
+ }
+
+ Item {
+ Layout.fillWidth: true
+
+ Layout.minimumHeight: 20
+ Layout.preferredHeight: 20
+ Layout.maximumHeight: 20
+ }
+
+ ColumnLayout {
+ Layout.fillWidth: true
+
+ Label {
+ Layout.fillWidth: true
+
+ Layout.maximumHeight: 27
+ Layout.preferredHeight: 27
+ Layout.minimumHeight: 27
+
+ text: qsTr("Linked Device")
+ font.pointSize: 13
+ font.kerning: true
+
+ horizontalAlignment: Text.AlignLeft
+ verticalAlignment: Text.AlignVCenter
+ }
+
+ Item {
+ Layout.fillHeight: true
+
+ Layout.maximumWidth: 10
+ Layout.preferredWidth: 10
+ Layout.minimumWidth: 10
+ }
+
+ ColumnLayout {
+ spacing: 7
+
+ Layout.fillWidth: true
+
+ ListViewJami {
+ id: settingsListView
+
+ Layout.leftMargin: 20
+
+ Layout.fillWidth: true
+
+ Layout.minimumWidth: 580
+ Layout.preferredWidth: 605
+
+ Layout.minimumHeight: 164
+ Layout.preferredHeight: 164
+ Layout.maximumHeight: 164
+
+ model: deviceItemListModel
+
+ delegate: DeviceItemDelegate{
+ id: settingsListDelegate
+
+ width: settingsListView.width
+ height: 85
+
+ deviceName : DeviceName
+ deviceId: DeviceID
+ isCurrent: IsCurrent
+
+ onClicked: {
+ settingsListView.currentIndex = index
+ }
+
+ onBtnRemoveDeviceClicked:{
+ removeDeviceSlot(index)
+ }
+ }
+ }
+
+ HoverableRadiusButton {
+ id: linkDevPushButton
+
+ visible: ClientWrapper.settingsAdaptor.getAccountConfig_Manageruri() === ""
+
+ Layout.leftMargin: 20
+
+ Layout.fillWidth: true
+
+ Layout.maximumHeight: 30
+ Layout.preferredHeight: 30
+ Layout.minimumHeight: 30
+
+ radius: height / 2
+
+ text: qsTr("+Link Another Device")
+ font.pointSize: 10
+ font.kerning: true
+
+ onClicked: {
+ showLinkDevSlot()
+ }
+ }
+ }
+ }
+
+ Item {
+ Layout.fillWidth: true
+
+ Layout.minimumHeight: 20
+ Layout.preferredHeight: 20
+ Layout.maximumHeight: 20
+ }
+
+ // banned list view
+ ColumnLayout {
+ id: bannedContactsLayoutWidget
+
+ Layout.fillWidth: true
+ spacing: 6
+
+ RowLayout {
+ Layout.leftMargin: 9
+ Layout.rightMargin: 8
+ Layout.topMargin: 1
+
+ Layout.fillWidth: true
+ Layout.maximumHeight: 30
+
+ Label {
+ Layout.preferredWidth: 164
+ Layout.minimumWidth: 164
+
+ Layout.minimumHeight: 30
+ Layout.preferredHeight: 30
+ Layout.maximumHeight: 30
+
+ text: qsTr("Banned Contact")
+ font.pointSize: 13
+ font.kerning: true
+
+ horizontalAlignment: Text.AlignLeft
+ verticalAlignment: Text.AlignVCenter
+ }
+
+ Item {
+ Layout.fillHeight: true
+
+ Layout.maximumWidth: 10
+ Layout.preferredWidth: 10
+ Layout.minimumWidth: 10
+ }
+
+ HoverableRadiusButton {
+ id: bannedContactsBtn
+
+ Layout.maximumWidth: 30
+ Layout.preferredWidth: 30
+ Layout.minimumWidth: 30
+
+ Layout.minimumHeight: 30
+ Layout.preferredHeight: 30
+ Layout.maximumHeight: 30
+
+ buttonImageHeight: height
+ buttonImageWidth: height
+
+ radius: height / 2
+
+ icon.source: bannedContactsListWidget.visible? "qrc:/images/icons/round-arrow_drop_up-24px.svg" : "qrc:/images/icons/round-arrow_drop_down-24px.svg"
+ icon.height: 32
+ icon.width: 32
+
+ onClicked: {
+ toggleBannedContacts()
+ }
+ }
+
+ Item {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ }
+ }
+
+ ColumnLayout {
+ id: bannedContactsListWidget
+
+ spacing: 6
+
+ Layout.leftMargin: 9
+ Layout.rightMargin: 8
+ Layout.bottomMargin: 9
+ Item {
+ Layout.fillWidth: true
+
+ Layout.minimumHeight: 10
+ Layout.preferredHeight: 10
+ Layout.maximumHeight: 10
+ }
+
+ ListViewJami {
+ id: bannedListWidget
+
+ Layout.leftMargin: 20
+ Layout.fillWidth: true
+
+ Layout.minimumWidth: 580
+
+ Layout.minimumHeight: 150
+ Layout.preferredHeight: 150
+ Layout.maximumHeight: 150
+
+ model: bannedListModel
+
+ delegate: BannedItemDelegate{
+ id: bannedListDelegate
+
+ width: bannedListWidget.width
+ height: 74
+
+ contactName : ContactName
+ contactID: ContactID
+ contactPicture_base64: ContactPicture
+
+ onClicked: {
+ bannedListWidget.currentIndex = index
+ }
+
+ onBtnReAddContactClicked: {
+ unban(index)
+ }
+ }
+ }
+ }
+ }
+
+ Item {
+ Layout.fillWidth: true
+
+ Layout.minimumHeight: 20
+ Layout.preferredHeight: 20
+ Layout.maximumHeight: 20
+ }
+
+ RowLayout {
+ Layout.fillWidth: true
+
+ Layout.minimumHeight: 30
+ Layout.preferredHeight: 30
+ Layout.maximumHeight: 30
+
+ Item {
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ }
+
+ HoverableRadiusButton {
+ id: advancedAccountSettingsPButton
+
+ Layout.minimumWidth: 180
+
+ Layout.minimumHeight: 30
+ Layout.preferredHeight: 30
+ Layout.maximumHeight: 30
+
+ radius: height / 2
+
+ text: qsTr("Advanced Account Settings")
+ font.pointSize: 10
+ font.kerning: true
+
+ icon.source: {
+ if (advanceSettingsView.visible) {
+ return "qrc:/images/icons/round-arrow_drop_up-24px.svg"
+ } else {
+ return "qrc:/images/icons/round-arrow_drop_down-24px.svg"
+ }
+ }
+
+ icon.height: 24
+ icon.width: 24
+
+ onClicked: {
+ advanceSettingsView.visible = !advanceSettingsView.visible
+ if (advanceSettingsView.visible) {
+ advanceSettingsView.updateAccountInfoDisplayedAdvance()
+ var mappedCoor = advancedAccountSettingsPButton.mapToItem(accoutnViewLayout,advancedAccountSettingsPButton.x,advancedAccountSettingsPButton.y)
+ accoutScrollView.vScrollBar.position = mappedCoor.y / accoutnViewLayout.height
+ } else {
+ accoutScrollView.vScrollBar.position = 0
+ }
+ }
+ }
+
+ Item {
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ }
+ }
+ }
+
+ Item {
+ Layout.fillWidth: true
+
+ Layout.minimumHeight: 48
+ Layout.preferredHeight: 48
+ Layout.maximumHeight: 48
+ }
+
+ ColumnLayout {
+ spacing: 6
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+
+ Layout.leftMargin: 30
+
+ // instantiate advance setting page
+ AdvancedSettingsView {
+ id: advanceSettingsView
+
+ Layout.leftMargin: 10
+ visible: false
+ }
+ }
+ }
+ }
+
+ Item {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ }
+ }
+}