Source code for pyside_demo.gui.data
from PySide6.QtCore import Qt
from PySide6.QtWidgets import (
QHBoxLayout,
QLineEdit,
QListWidget,
QListWidgetItem,
QMessageBox,
QPushButton,
QTextEdit,
QVBoxLayout,
QWidget,
)
from pyside_demo.gui.dialog import ConflictResolutionDialog
from pyside_demo.model.table import TableModel
[docs]
class DataWidget(QWidget):
def __init__(self, model: TableModel):
super().__init__()
self.model = model
self.main_layout = QHBoxLayout(self)
# Left side: Add/Edit item form
self.left_layout = QVBoxLayout()
self.name_input = QLineEdit()
self.name_input.setPlaceholderText("Item Name")
self.description_input = QTextEdit()
self.description_input.setPlaceholderText("Item Description")
self.add_edit_button = QPushButton("Add Item")
self.add_edit_button.clicked.connect(self.add_or_edit_item)
self.left_layout.addWidget(self.name_input)
self.left_layout.addWidget(self.description_input)
self.left_layout.addWidget(self.add_edit_button)
# Right side: Item list and sync button
self.right_layout = QVBoxLayout()
self.item_list = QListWidget()
self.item_list.itemClicked.connect(self.load_item)
sync_button = QPushButton("Sync with PostgreSQL")
sync_button.clicked.connect(self.sync_with_postgresql)
self.right_layout.addWidget(self.item_list)
self.right_layout.addWidget(sync_button)
self.main_layout.addLayout(self.left_layout)
self.main_layout.addLayout(self.right_layout)
self.setLayout(self.main_layout)
self.load_items()
[docs]
def add_or_edit_item(self):
name = self.name_input.text()
description = self.description_input.toPlainText()
if name and description:
if self.add_edit_button.text() == "Add Item":
self.model.add_item(name, description)
else:
selected_items = self.item_list.selectedItems()
if selected_items:
item_id = selected_items[0].data(Qt.ItemDataRole.UserRole)
self.model.update_item(item_id, name, description)
self.name_input.clear()
self.description_input.clear()
self.add_edit_button.setText("Add Item")
self.load_items()
else:
QMessageBox.warning(
self, "Input Error", "Please enter both name and description."
)
[docs]
def load_items(self):
self.item_list.clear()
items = self.model.get_items()
for item in items:
list_item = QListWidgetItem(
f"{item['name']} ({item['sync_status']})"
)
list_item.setData(Qt.ItemDataRole.UserRole, item["id"])
self.item_list.addItem(list_item)
[docs]
def load_item(self, item):
item_id = item.data(Qt.ItemDataRole.UserRole)
db_item = self.model.get_item_by_id(item_id)
if db_item:
self.name_input.setText(str(db_item["name"]))
self.description_input.setPlainText(str(db_item["description"]))
self.add_edit_button.setText("Update Item")
[docs]
def sync_with_postgresql(self):
self.model.sync_with_postgresql()
self.resolve_conflicts()
self.load_items()
QMessageBox.information(
self,
"Sync Status",
"Synchronization completed. Check console for details.",
)
[docs]
def resolve_conflicts(self):
conflict_items = self.model.get_conflict_items()
for item in conflict_items:
dialog = ConflictResolutionDialog(item)
if dialog.exec_():
resolution = dialog.get_resolution()
self.model.resolve_conflict(item["id"], resolution)