diff options
Diffstat (limited to 'examples/quickcontrols/contactslist/contactmodel.py')
-rw-r--r-- | examples/quickcontrols/contactslist/contactmodel.py | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/examples/quickcontrols/contactslist/contactmodel.py b/examples/quickcontrols/contactslist/contactmodel.py new file mode 100644 index 000000000..313a58305 --- /dev/null +++ b/examples/quickcontrols/contactslist/contactmodel.py @@ -0,0 +1,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() |