14
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
18
18
import QtContacts 5.0
20
import Ubuntu.Components 1.2
21
import Ubuntu.Components.ListItems 1.0 as ListItem
22
import Ubuntu.Components.Popups 1.0 as Popups
20
import Ubuntu.Components 1.3
21
import Ubuntu.Components.ListItems 1.3 as ListItem
22
import Ubuntu.Components.Popups 1.3 as Popups
23
23
import Ubuntu.Contacts 0.1 as ContactsUI
24
24
import Ubuntu.Content 1.1 as ContentHub
26
26
import Ubuntu.AddressBook.Base 0.1
27
27
import Ubuntu.AddressBook.ContactShare 0.1
29
ContactsUI.PageWithBottomEdge {
31
31
objectName: "contactListPage"
36
36
property QtObject contactIndex: null
37
37
property string newPhoneToAdd: ""
38
38
property alias contactManager: contactList.manager
39
property Page contactViewPage: null
40
property Page contactEditorPage: null
42
readonly property bool bottomEdgePageOpened: bottomEdge.opened && bottomEdge.fullLoaded
40
43
readonly property bool isEmpty: (contactList.count === 0)
41
44
readonly property bool allowToQuit: (application.callbackApplication.length > 0)
42
45
readonly property var contactModel: contactList.listModel ? contactList.listModel : null
56
59
function createContactWithPhoneNumber(phoneNumber)
58
var newContact = ContactsJS.createEmptyContact(phoneNumber, mainPage)
59
//WORKAROUND: SKD changes the page header as soon as the page get created
60
// setting active false will avoid that
61
if (bottomEdgeEnabled) {
62
mainPage.showBottomEdgePage(Qt.resolvedUrl("ABContactEditorPage.qml"),
63
{model: contactList.listModel,
67
initialFocusSection: "name"})
69
pageStack.push(Qt.resolvedUrl("ABContactEditorPage.qml"),
70
{model: contactList.listModel,
72
initialFocusSection: "name"})
76
function showContact(contactId)
78
pageStack.push(Qt.resolvedUrl("ABContactViewPage.qml"),
79
{model: contactList.listModel, contactId: contactId})
61
var newContact = ContactsJS.createEmptyContact(phoneNumber, mainPage);
62
openEditPage({model: contactList.listModel,
64
initialFocusSection: "name"},
68
function openEditPage(editPageProperties, sourcePage) {
69
var incubator = pageStack.addPageToNextColumn(sourcePage,
70
Qt.resolvedUrl("ABContactEditorPage.qml"),
72
incubator.onStatusChanged = function(status) {
73
if (status == Component.Ready) {
74
mainPage.contactEditorPage = incubator.object;
79
function openViewPage(viewPageProperties) {
80
var incubator = pageStack.addPageToNextColumn(mainPage,
81
Qt.resolvedUrl("ABContactViewPage.qml"),
83
incubator.onStatusChanged = function(status) {
84
if (status == Component.Ready) {
85
contactViewPage = incubator.object;
90
function showContact(contact)
92
mainPage.state = "default";
93
openViewPage({model: contactList.listModel,
97
function showContactWithId(contactId)
99
openViewPage({model: contactList.listModel,
100
contactId: contactId});
82
103
function addPhoneToContact(contactId, phoneNumber)
84
pageStack.push(Qt.resolvedUrl("ABContactViewPage.qml"),
85
{model: contactList.listModel,
87
addPhoneToContact: phoneNumber})
105
openViewPage({model: contactList.listModel,
106
contactId: contactId,
107
addPhoneToContact: phoneNumber});
90
110
function importContact(urls)
124
144
contactList.reset()
147
function showContactEditorPage(editorPage) {
148
contactList.currentIndex = -1;
149
mainPage.contactEditorPage = editorPage;
150
pageStack.addPageToNextColumn(mainPage, editorPage);
152
editorPage.contactSaved.connect(onNewContactSaved);
155
function onNewContactSaved(contact) {
156
if (pageStack.columns > 1) {
157
showContact(contact);
127
161
title: i18n.tr("Contacts")
129
bottomEdgeEnabled: !contactList.isInSelectionMode
132
164
ContactsUI.ContactListView {
134
166
objectName: "contactListView"
135
167
showImportOptions: !mainPage.pickMode &&
136
mainPage.newPhoneToAdd === ""
168
mainPage.newPhoneToAdd === "" &&
169
(!mainPage.contactEditorPage || !mainPage.contactEditorPage.active)
139
172
left: parent.left
143
176
filterTerm: searchField.text
144
177
multiSelectionEnabled: true
145
178
multipleSelection: (mainPage.pickMode && mainPage.pickMultipleContacts) || !mainPage.pickMode
179
highlightedContact: contactViewPage ? contactViewPage.contact :
180
contactEditorPage ? contactEditorPage.contact : null
147
182
onAddContactClicked: mainPage.createContactWithPhoneNumber(label)
148
183
onAddNewContactClicked: mainPage.createContactWithPhoneNumber(mainPage.newPhoneToAdd)
150
185
onContactClicked: {
151
mainPage.state = "default"
152
pageStack.push(Qt.resolvedUrl("ABContactViewPage.qml"),
153
{model: contactList.listModel,
186
showContact(contact);
156
188
onIsInSelectionModeChanged: mainPage.state = isInSelectionMode ? "selection" : "default"
157
189
onSelectionCanceled: {
394
// We need to reset the page proprerties in case of the page was created pre-populated,
395
// with phonenumber or contact.
396
onBottomEdgeDismissed: {
397
//WORKAROUND: SKD changes the page header as soon as the page get created
398
// setting active false will avoid that
399
var newContact = ContactsUI.ContactsJS.createEmptyContact("", mainPage)
400
mainPage.setBottomEdgePage(Qt.resolvedUrl("ABContactEditorPage.qml"),
401
{model: contactList.listModel,
405
initialFocusSection: "name"})
408
429
KeyboardRectangle {
519
542
contactList.listModel.importContacts("file://" + TEST_DATA)
522
mainPage.setBottomEdgePage(Qt.resolvedUrl("ABContactEditorPage.qml"),
523
{model: contactList.listModel,
524
contact: ContactsUI.ContactsJS.createEmptyContact("", mainPage),
527
initialFocusSection: "name"})
530
546
pageStack.contactListPage = mainPage
551
id: editorPageBottomEdge
552
ABContactEditorPage {
554
implicitWidth: mainPage.width
555
implicitHeight: mainPage.height
556
model: contactList.listModel
557
contact: ContactsJS.createEmptyContact("", mainPage)
558
initialFocusSection: "name"
565
ContactsUI.ContactDelegate {
566
property Contact contact: Contact {
568
firstName: i18n.tr("New contact")
571
imageUrl: "image://theme/contact"
574
width: mainPage.width
580
objectName: "bottomEdge"
582
property var incubator
584
// FIXME: this is a workaround for the lack of fully asynchronous loading
585
// of Pages in AdaptativePageLayout
586
function createObjectAsynchronously(url, properties, callback) {
587
var component = Qt.createComponent(url, Component.Asynchronous);
588
if (component.status == Component.Ready) {
589
incubateObject(component, properties, callback);
591
component.onStatusChanged.connect(function(status) {
592
if (status == Component.Ready) {
593
incubateObject(component, properties, callback);
599
function incubateObject(component, properties, callback) {
600
if (component.status == Component.Ready) {
601
incubator = component.incubateObject(null,
604
incubator.onStatusChanged = function(status) {
605
if (status == Component.Ready) {
606
callback(incubator.object);
613
function loadEditorPage() {
614
var newContact = ContactsJS.createEmptyContact("", mainPage);
615
createObjectAsynchronously(Qt.resolvedUrl("ABContactEditorPage.qml"),
616
{model: contactList.listModel,
618
initialFocusSection: "name"},
619
showContactEditorPage);
623
contentComponent: pageStack.columns == 1 ? editorPageBottomEdge : emptyContact
624
flickable: contactList
625
iconName: "contact-new"
626
enabled: !contactList.isInSelectionMode
627
backGroundEffectEnabled: pageStack.columns === 1
630
contactList.prepareNewContact = true;
631
contactList.positionViewAtBeginning();
632
if (pageStack.columns > 1) {
637
bottomEdge.visible = false;
638
contactList.showNewContact = true;
639
if (pageStack.columns <= 1) {
640
showContactEditorPage(bottomEdge.content);
650
target: mainPage.contactViewPage
652
openEditPage(editPageProperties, mainPage.contactViewPage);
657
target: mainPage.contactEditorPage
659
if (!mainPage.contactEditorPage.active) {
660
contactList.prepareNewContact = false;
661
contactList.showNewContact = false;
662
bottomEdge.visible = true;