1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
# Copyright (C) 2023 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import bisect
from dataclasses import dataclass
from enum import IntEnum
from PySide6.QtCore import (QAbstractListModel, QEnum, Qt, QModelIndex, Slot,
QByteArray)
from PySide6.QtQml import QmlElement
QML_IMPORT_NAME = "Backend"
QML_IMPORT_MAJOR_VERSION = 1
@QmlElement
class ContactModel(QAbstractListModel):
@QEnum
class ContactRole(IntEnum):
FullNameRole = Qt.DisplayRole
AddressRole = Qt.UserRole
CityRole = Qt.UserRole + 1
NumberRole = Qt.UserRole + 2
@dataclass
class Contact:
fullName: str
address: str
city: str
number: str
def __init__(self, parent=None) -> None:
super().__init__(parent)
self.m_contacts = []
self.m_contacts.append(self.Contact("Angel Hogan", "Chapel St. 368 ", "Clearwater",
"0311 1823993"))
self.m_contacts.append(self.Contact("Felicia Patton", "Annadale Lane 2", "Knoxville",
"0368 1244494"))
self.m_contacts.append(self.Contact("Grant Crawford", "Windsor Drive 34", "Riverdale",
"0351 7826892"))
self.m_contacts.append(self.Contact("Gretchen Little", "Sunset Drive 348", "Virginia Beach",
"0343 1234991"))
self.m_contacts.append(self.Contact("Geoffrey Richards", "University Lane 54", "Trussville",
"0423 2144944"))
self.m_contacts.append(self.Contact("Henrietta Chavez", "Via Volto San Luca 3",
"Piobesi Torinese", "0399 2826994"))
self.m_contacts.append(self.Contact("Harvey Chandler", "North Squaw Creek 11",
"Madisonville", "0343 1244492"))
self.m_contacts.append(self.Contact("Miguel Gomez", "Wild Rose Street 13", "Trussville" ,
"0343 9826996"))
self.m_contacts.append(self.Contact("Norma Rodriguez", " Glen Eagles Street 53",
"Buffalo", "0241 5826596"))
self.m_contacts.append(self.Contact("Shelia Ramirez", "East Miller Ave 68", "Pickerington",
"0346 4844556"))
self.m_contacts.append(self.Contact("Stephanie Moss", "Piazza Trieste e Trento 77",
"Roata Chiusani", "0363 0510490"))
def rowCount(self, parent=QModelIndex()):
return len(self.m_contacts)
def data(self, index: QModelIndex, role: int):
row = index.row()
if row < self.rowCount():
if role == ContactModel.ContactRole.FullNameRole:
return self.m_contacts[row].fullName
elif role == ContactModel.ContactRole.AddressRole:
return self.m_contacts[row].address
elif role == ContactModel.ContactRole.CityRole:
return self.m_contacts[row].city
elif role == ContactModel.ContactRole.NumberRole:
return self.m_contacts[row].number
def roleNames(self):
default = super().roleNames()
default[ContactModel.ContactRole.FullNameRole] = QByteArray(b"fullName")
default[ContactModel.ContactRole.AddressRole] = QByteArray(b"address")
default[ContactModel.ContactRole.CityRole] = QByteArray(b"city")
default[ContactModel.ContactRole.NumberRole] = QByteArray(b"number")
return default
@Slot(int)
def get(self, row: int):
contact = self.m_contacts[row]
return {"fullName": contact.fullName, "address": contact.address,
"city": contact.city, "number": contact.number}
@Slot(str, str, str, str)
def append(self, full_name: str, address: str, city: str, number: str):
contact = self.Contact(full_name, address, city, number)
contact_names = [contact.fullName for contact in self.m_contacts]
index = bisect.bisect(contact_names, contact.fullName)
self.beginInsertRows(QModelIndex(), index, index)
self.m_contacts.insert(index, contact)
self.endInsertRows()
@Slot(int, str, str, str, str)
def set(self, row: int, full_name: str, address: str, city: str, number: str):
if row < 0 or row >= len(self.m_contacts):
return
self.m_contacts[row] = self.Contact(full_name, address, city, number)
self.dataChanged(self.index(row, 0), self.index(row, 0),
[ContactModel.ContactRole.FullNameRole,
ContactModel.ContactRole.AddressRole,
ContactModel.ContactRole.CityRole,
ContactModel.ContactRole.NumberRole])
@Slot(int)
def remove(self, row):
if row < 0 or row >= len(self.m_contacts):
return
self.beginRemoveRows(QModelIndex(), row, row)
del self.m_contacts[row]
self.endRemoveRows()
|