Commit 3839f917 authored by Ronan Abhamon's avatar Ronan Abhamon

feat(ui/views/App/MainWindow/ContactEdit): display contact addresses

parent 534c5f0a
...@@ -112,11 +112,11 @@ ...@@ -112,11 +112,11 @@
</message> </message>
<message> <message>
<source>sipAccountsInput</source> <source>sipAccountsInput</source>
<translation type="unfinished">SIP Address</translation> <translation type="obsolete">SIP Address</translation>
</message> </message>
<message> <message>
<source>address</source> <source>address</source>
<translation type="obsolete">ADDRESS</translation> <translation type="unfinished">ADDRESS</translation>
</message> </message>
<message> <message>
<source>addressInput</source> <source>addressInput</source>
...@@ -128,7 +128,7 @@ ...@@ -128,7 +128,7 @@
</message> </message>
<message> <message>
<source>emailsInput</source> <source>emailsInput</source>
<translation type="unfinished">E-mail address</translation> <translation type="obsolete">E-mail address</translation>
</message> </message>
<message> <message>
<source>webSites</source> <source>webSites</source>
...@@ -136,7 +136,7 @@ ...@@ -136,7 +136,7 @@
</message> </message>
<message> <message>
<source>webSitesInput</source> <source>webSitesInput</source>
<translation type="unfinished">URL</translation> <translation type="obsolete">URL</translation>
</message> </message>
<message> <message>
<source>avatarChooserTitle</source> <source>avatarChooserTitle</source>
...@@ -144,7 +144,7 @@ ...@@ -144,7 +144,7 @@
</message> </message>
<message> <message>
<source>companiesInput</source> <source>companiesInput</source>
<translation>Company</translation> <translation type="vanished">Company</translation>
</message> </message>
<message> <message>
<source>companies</source> <source>companies</source>
...@@ -158,6 +158,38 @@ ...@@ -158,6 +158,38 @@
<source>cancel</source> <source>cancel</source>
<translation>CANCEL</translation> <translation>CANCEL</translation>
</message> </message>
<message>
<source>sipAccountsPlaceholder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>companiesPlaceholder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>emailsPlaceholder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>webSitesPlaceholder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>street</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>postalCode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>country</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>locality</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>Contacts</name> <name>Contacts</name>
......
...@@ -104,11 +104,11 @@ ...@@ -104,11 +104,11 @@
</message> </message>
<message> <message>
<source>sipAccountsInput</source> <source>sipAccountsInput</source>
<translation type="unfinished">Adresse SIP</translation> <translation type="obsolete">Adresse SIP</translation>
</message> </message>
<message> <message>
<source>address</source> <source>address</source>
<translation type="obsolete">ADRESSE(S)</translation> <translation type="unfinished">ADRESSE(S)</translation>
</message> </message>
<message> <message>
<source>addressInput</source> <source>addressInput</source>
...@@ -120,7 +120,7 @@ ...@@ -120,7 +120,7 @@
</message> </message>
<message> <message>
<source>emailsInput</source> <source>emailsInput</source>
<translation type="unfinished">Adresse e-mail</translation> <translation type="obsolete">Adresse e-mail</translation>
</message> </message>
<message> <message>
<source>webSites</source> <source>webSites</source>
...@@ -128,16 +128,12 @@ ...@@ -128,16 +128,12 @@
</message> </message>
<message> <message>
<source>webSitesInput</source> <source>webSitesInput</source>
<translation type="unfinished">URL</translation> <translation type="obsolete">URL</translation>
</message> </message>
<message> <message>
<source>avatarChooserTitle</source> <source>avatarChooserTitle</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>companiesInput</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>companies</source> <source>companies</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
...@@ -150,6 +146,38 @@ ...@@ -150,6 +146,38 @@
<source>cancel</source> <source>cancel</source>
<translation type="unfinished">ANNULER</translation> <translation type="unfinished">ANNULER</translation>
</message> </message>
<message>
<source>sipAccountsPlaceholder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>companiesPlaceholder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>emailsPlaceholder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>webSitesPlaceholder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>street</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>postalCode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>country</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>locality</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>Contacts</name> <name>Contacts</name>
......
...@@ -143,6 +143,7 @@ ...@@ -143,6 +143,7 @@
<file>ui/modules/Common/Form/ExclusiveButtons.qml</file> <file>ui/modules/Common/Form/ExclusiveButtons.qml</file>
<file>ui/modules/Common/Form/ListForm.qml</file> <file>ui/modules/Common/Form/ListForm.qml</file>
<file>ui/modules/Common/Form/SmallButton.qml</file> <file>ui/modules/Common/Form/SmallButton.qml</file>
<file>ui/modules/Common/Form/StaticListForm.qml</file>
<file>ui/modules/Common/Form/TextButtonA.qml</file> <file>ui/modules/Common/Form/TextButtonA.qml</file>
<file>ui/modules/Common/Form/TextButtonB.qml</file> <file>ui/modules/Common/Form/TextButtonB.qml</file>
<file>ui/modules/Common/Form/TextField.qml</file> <file>ui/modules/Common/Form/TextField.qml</file>
......
import QtQuick 2.7 import QtQuick 2.7
// =================================================================== // =============================================================================
Item { Item {
property alias useStates: actionButton.useStates property alias useStates: actionButton.useStates
...@@ -10,7 +10,7 @@ Item { ...@@ -10,7 +10,7 @@ Item {
signal clicked signal clicked
// ----------------------------------------------------------------- // ---------------------------------------------------------------------------
height: iconSize || parent.iconSize || parent.height height: iconSize || parent.iconSize || parent.height
width: iconSize || parent.iconSize || parent.height width: iconSize || parent.iconSize || parent.height
......
...@@ -2,7 +2,7 @@ import QtQuick 2.7 ...@@ -2,7 +2,7 @@ import QtQuick 2.7
import Common.Styles 1.0 import Common.Styles 1.0
// =================================================================== // =============================================================================
Row { Row {
id: item id: item
......
import QtQuick 2.7
import QtQuick.Layouts 1.3
import Common.Styles 1.0
// =============================================================================
RowLayout {
id: form
property alias title: text.text
property bool readOnly: false
property var fields
// ---------------------------------------------------------------------------
spacing: 0
Text {
id: text
Layout.leftMargin: ListFormStyle.titleArea.iconSize + ListFormStyle.titleArea.spacing
Layout.preferredHeight: ListFormStyle.lineHeight
Layout.preferredWidth: ListFormStyle.titleArea.text.width
Layout.alignment: Qt.AlignTop
color: ListFormStyle.titleArea.text.color
elide: Text.ElideRight
font {
bold: true
pointSize: ListFormStyle.titleArea.text.fontSize
}
verticalAlignment: Text.AlignVCenter
}
ColumnLayout {
Layout.fillWidth: true
spacing: 0
Repeater {
model: form.fields
TransparentTextInput {
Layout.fillWidth: true
Layout.preferredHeight: ListFormStyle.lineHeight
placeholder: modelData.placeholder || ''
readOnly: form.readOnly
text: modelData.text || ''
}
}
}
}
...@@ -11,6 +11,7 @@ Item { ...@@ -11,6 +11,7 @@ Item {
property alias color: textInput.color property alias color: textInput.color
property alias font: textInput.font property alias font: textInput.font
property alias inputMethodHints: textInput.inputMethodHints property alias inputMethodHints: textInput.inputMethodHints
property alias placeholder: placeholder.text
property alias readOnly: textInput.readOnly property alias readOnly: textInput.readOnly
property alias text: textInput.text property alias text: textInput.text
property bool forceFocus: false property bool forceFocus: false
...@@ -59,17 +60,37 @@ Item { ...@@ -59,17 +60,37 @@ Item {
visible: parent.isInvalid visible: parent.isInvalid
} }
Text {
id: placeholder
anchors.centerIn: parent
color: TransparentTextInputStyle.placeholder.color
elide: Text.ElideRight
font {
italic: true
pointSize: TransparentTextInputStyle.placeholder.fontSize
}
height: textInput.height
width: textInput.width
verticalAlignment: Text.AlignVCenter
visible: textInput.text.length === 0 && !textInput.activeFocus && !textInput.readOnly
}
TextInput { TextInput {
id: textInput id: textInput
anchors.centerIn: parent anchors.centerIn: parent
height: parent.height - parent.padding * 2 height: parent.height
width: parent.width - parent.padding * 2 width: parent.width - parent.padding * 2
clip: true clip: true
color: activeFocus && !readOnly color: activeFocus && !readOnly
? TransparentTextInputStyle.textColor.focused ? TransparentTextInputStyle.text.color.focused
: TransparentTextInputStyle.textColor.normal : TransparentTextInputStyle.text.color.normal
font.pointSize: TransparentTextInputStyle.text.fontSize
selectByMouse: true selectByMouse: true
verticalAlignment: TextInput.AlignVCenter verticalAlignment: TextInput.AlignVCenter
......
...@@ -10,8 +10,17 @@ QtObject { ...@@ -10,8 +10,17 @@ QtObject {
property int iconSize: 12 property int iconSize: 12
property int padding: 10 property int padding: 10
property QtObject textColor: QtObject { property QtObject placeholder: QtObject {
property color focused: Colors.l property color color: Colors.w
property color normal: Colors.r property int fontSize: 10
}
property QtObject text: QtObject {
property int fontSize: 10
property QtObject color: QtObject {
property color focused: Colors.l
property color normal: Colors.r
}
} }
} }
...@@ -38,6 +38,7 @@ CheckBoxText 1.0 Form/CheckBoxText.qml ...@@ -38,6 +38,7 @@ CheckBoxText 1.0 Form/CheckBoxText.qml
ExclusiveButtons 1.0 Form/ExclusiveButtons.qml ExclusiveButtons 1.0 Form/ExclusiveButtons.qml
LightButton 1.0 Form/LightButton.qml LightButton 1.0 Form/LightButton.qml
ListForm 1.0 Form/ListForm.qml ListForm 1.0 Form/ListForm.qml
StaticListForm 1.0 Form/StaticListForm.qml
TextButtonA 1.0 Form/TextButtonA.qml TextButtonA 1.0 Form/TextButtonA.qml
TextButtonB 1.0 Form/TextButtonB.qml TextButtonB 1.0 Form/TextButtonB.qml
TextField 1.0 Form/TextField.qml TextField 1.0 Form/TextField.qml
......
...@@ -70,35 +70,6 @@ ColumnLayout { ...@@ -70,35 +70,6 @@ ColumnLayout {
usernameInput.text = _vcard.username usernameInput.text = _vcard.username
} }
function _handleSipAddressChanged (index, defaultValue, newValue) {
if (!Utils.startsWith(newValue, 'sip:')) {
newValue = 'sip:' + newValue
if (newValue === defaultValue) {
return
}
}
var so_far_so_good = (defaultValue.length === 0)
? _vcard.addSipAddress(newValue)
: _vcard.updateSipAddress(defaultValue, newValue)
addresses.setInvalid(index, !so_far_so_good)
}
function _handleUrlChanged (index, defaultValue, newValue) {
var url = Utils.extractFirstUri(newValue)
if (url === defaultValue) {
return
}
var so_far_so_good = (defaultValue.length === 0)
? url && _vcard.addUrl(newValue)
: url && _vcard.updateUrl(defaultValue, newValue)
urls.setInvalid(index, !so_far_so_good)
}
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
spacing: 0 spacing: 0
...@@ -218,140 +189,215 @@ ColumnLayout { ...@@ -218,140 +189,215 @@ ColumnLayout {
// Info list. // Info list.
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
Flickable { Loader {
id: flick
Layout.fillHeight: true Layout.fillHeight: true
Layout.fillWidth: true Layout.fillWidth: true
ScrollBar.vertical: ForceScrollBar {}
boundsBehavior: Flickable.StopAtBounds active: _vcard != null
clip: true sourceComponent: Flickable {
contentHeight: infoList.height id: flick
contentWidth: width - ScrollBar.vertical.width
flickableDirection: Flickable.VerticalFlick
ColumnLayout { // -----------------------------------------------------------------------
id: infoList
width: flick.contentWidth
ListForm { function _handleSipAddressChanged (index, defaultValue, newValue) {
id: addresses if (!Utils.startsWith(newValue, 'sip:')) {
newValue = 'sip:' + newValue
Layout.leftMargin: ContactEditStyle.values.leftMargin if (newValue === defaultValue) {
Layout.rightMargin: ContactEditStyle.values.rightMargin return
Layout.topMargin: ContactEditStyle.values.topMargin }
}
defaultData: _vcard.sipAddresses var so_far_so_good = (defaultValue.length === 0)
minValues: _contact ? 1 : 0 ? _vcard.addSipAddress(newValue)
placeholder: qsTr('sipAccountsInput') : _vcard.updateSipAddress(defaultValue, newValue)
readOnly: !_edition
title: qsTr('sipAccounts')
onChanged: _handleSipAddressChanged(index, defaultValue, newValue) addresses.setInvalid(index, !so_far_so_good)
onRemoved: _vcard.removeSipAddress(value)
} }
Rectangle { function _handleCompanyChanged (index, defaultValue, newValue) {
Layout.fillWidth: true var so_far_so_good = (defaultValue.length === 0)
Layout.preferredHeight: ContactEditStyle.values.separator.height ? _vcard.addCompany(newValue)
color: ContactEditStyle.values.separator.color : _vcard.updateCompany(defaultValue, newValue)
companies.setInvalid(index, !so_far_so_good)
} }
ListForm { function _handleEmailChanged (index, defaultValue, newValue) {
id: companies var so_far_so_good = (defaultValue.length === 0)
? _vcard.addEmail(newValue)
: _vcard.updateEmail(defaultValue, newValue)
Layout.leftMargin: ContactEditStyle.values.leftMargin emails.setInvalid(index, !so_far_so_good)
Layout.rightMargin: ContactEditStyle.values.rightMargin }
defaultData: _vcard.companies function _handleUrlChanged (index, defaultValue, newValue) {
placeholder: qsTr('companiesInput') var url = Utils.extractFirstUri(newValue)
readOnly: !_edition if (url === defaultValue) {
title: qsTr('companies') return
}
onChanged: defaultValue.length === 0 var so_far_so_good = (defaultValue.length === 0)
? _vcard.addCompany(newValue) ? url && _vcard.addUrl(newValue)
: _vcard.updateCompany(defaultValue, newValue) : url && _vcard.updateUrl(defaultValue, newValue)
onRemoved: _vcard.removeCompany(value)
}
Rectangle { urls.setInvalid(index, !so_far_so_good)
Layout.fillWidth: true
Layout.preferredHeight: ContactEditStyle.values.separator.height
color: ContactEditStyle.values.separator.color
} }
ListForm { // -----------------------------------------------------------------------
id: emails
Layout.leftMargin: ContactEditStyle.values.leftMargin ScrollBar.vertical: ForceScrollBar {}
Layout.rightMargin: ContactEditStyle.values.rightMargin
defaultData: _vcard.emails boundsBehavior: Flickable.StopAtBounds
inputMethodHints: Qt.ImhEmailCharactersOnly clip: true
placeholder: qsTr('emailsInput') contentHeight: infoList.height
readOnly: !_edition contentWidth: width - ScrollBar.vertical.width
title: qsTr('emails') flickableDirection: Flickable.VerticalFlick
onChanged: defaultValue.length === 0 ColumnLayout {
? _vcard.addEmail(newValue) id: infoList
: _vcard.updateEmail(defaultValue, newValue)
onRemoved: _vcard.removeEmail(value)
}
Rectangle { width: flick.contentWidth
Layout.fillWidth: true
Layout.preferredHeight: ContactEditStyle.values.separator.height
color: ContactEditStyle.values.separator.color
}
ListForm { ListForm {
id: urls id: addresses
Layout.leftMargin: ContactEditStyle.values.leftMargin Layout.leftMargin: ContactEditStyle.values.leftMargin
Layout.rightMargin: ContactEditStyle.values.rightMargin Layout.rightMargin: ContactEditStyle.values.rightMargin
Layout.topMargin: ContactEditStyle.values.topMargin
defaultData: _vcard.urls defaultData: _vcard.sipAddresses
inputMethodHints: Qt.ImhUrlCharactersOnly minValues: _contact ? 1 : 0
placeholder: qsTr('webSitesInput') placeholder: qsTr('sipAccountsPlaceholder')
readOnly: !_edition readOnly: !_edition
title: qsTr('webSites') title: qsTr('sipAccounts')
onChanged: _handleUrlChanged(index, defaultValue, newValue) onChanged: _handleSipAddressChanged(index, defaultValue, newValue)
onRemoved: _vcard.removeUrl(value) onRemoved: _vcard.removeSipAddress(value)
} }
Rectangle { Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: ContactEditStyle.values.separator.height Layout.preferredHeight: ContactEditStyle.values.separator.height
color: ContactEditStyle.values.separator.color color: ContactEditStyle.values.separator.color
} }
// ----------------------------------------------------------------------- ListForm {
// Edition buttons. id: companies
// -----------------------------------------------------------------------
Layout.leftMargin: ContactEditStyle.values.leftMargin
Layout.rightMargin: ContactEditStyle.values.rightMargin
Row { defaultData: _vcard.companies
Layout.alignment: Qt.AlignHCenter placeholder: qsTr('companiesPlaceholder')
Layout.topMargin: ContactEditStyle.buttons.topMargin readOnly: !_edition
spacing: ContactEditStyle.buttons.spacing title: qsTr('companies')
visible: _edition
TextButtonB { onChanged: _handleCompanyChanged(index, defaultValue, newValue)
enabled: usernameInput.text.length > 0 && _vcard.sipAddresses.length > 0 onRemoved: _vcard.removeCompany(value)
text: qsTr('save')
onClicked: _save()
} }
TextButtonA { Rectangle {
text: qsTr('cancel') Layout.fillWidth: true
onClicked: _cancel() Layout.preferredHeight: ContactEditStyle.values.separator.height
color: ContactEditStyle.values.separator.color
} }
}
Item { ListForm {
Layout.bottomMargin: ContactEditStyle.values.bottomMargin id: emails
Layout.leftMargin: ContactEditStyle.values.leftMargin
Layout.rightMargin: ContactEditStyle.values.rightMargin
defaultData: _vcard.emails
inputMethodHints: Qt.ImhEmailCharactersOnly
placeholder: qsTr('emailsPlaceholder')
readOnly: !_edition
title: qsTr('emails')
onChanged: _handleEmailChanged(index, defaultValue, newValue)
onRemoved: _vcard.removeEmail(value)
}
Rectangle {
Layout.fillWidth: true
Layout.preferredHeight: ContactEditStyle.values.separator.height
color: ContactEditStyle.values.separator.color
}
ListForm {
id: urls
Layout.leftMargin: ContactEditStyle.values.leftMargin
Layout.rightMargin: ContactEditStyle.values.rightMargin
defaultData: _vcard.urls
inputMethodHints: Qt.ImhUrlCharactersOnly
placeholder: qsTr('webSitesPlaceholder')
readOnly: !_edition
title: qsTr('webSites')
onChanged: _handleUrlChanged(index, defaultValue, newValue)
onRemoved: _vcard.removeUrl(value)
}
Rectangle {
Layout.fillWidth: true
Layout.preferredHeight: ContactEditStyle.values.separator.height
color: ContactEditStyle.values.separator.color
}
StaticListForm {
Layout.leftMargin: ContactEditStyle.values.leftMargin
Layout.rightMargin: ContactEditStyle.values.rightMargin
fields: {
var address = _vcard.address
return [{
placeholder: qsTr('street'),
text: address.street
}, {
placeholder: qsTr('locality'),
text: address.locality
}, {
placeholder: qsTr('postalCode'),
text: address.postalCode
}, {
placeholder: qsTr('country'),
text: address.country
}]
}
readOnly: !_edition
title: qsTr('address')
}
// ---------------------------------------------------------------------
// Edition buttons.
// ---------------------------------------------------------------------
Row {
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: ContactEditStyle.buttons.topMargin
spacing: ContactEditStyle.buttons.spacing
visible: _edition
TextButtonA {
text: qsTr('cancel')
onClicked: _cancel()
}
TextButtonB {
enabled: usernameInput.text.length > 0 && _vcard.sipAddresses.length > 0
text: qsTr('save')
onClicked: _save()
}
}
Item {
Layout.bottomMargin: ContactEditStyle.values.bottomMargin
}
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment