# -*- coding:utf-8

from PyQt4 import QtGui
from PyQt4 import QtCore
import sys

class Window(QtGui.QWidget):
    """Classe principale"""
    def __init__(self, parent):
        """Constructeur"""
        super(Window, self).__init__(parent)
        self.setWindowTitle("Exemple de QDataWidgetMapper")

        self.setupModel()

        # Nom
        self.nameLabel=QtGui.QLabel("Nom:")
        self.nameEdit=QtGui.QLineEdit()

        # Adresse        
        self.addressLabel=QtGui.QLabel("Adresse:")
        self.addressEdit=QtGui.QTextEdit()

        # Type
        self.typeComboBox=QtGui.QComboBox()
        self.typeComboBox.setModel(self.typeModel)

        # Navigation
        self.nextButton=QtGui.QPushButton("Suivant")
        self.previousButton=QtGui.QPushButton("Précédent")

        # Widget de correspondance
        self.mapper=QtGui.QDataWidgetMapper(self)
        self.mapper.setModel(self.model)
        delegate=Delegate()
        self.mapper.setItemDelegate(delegate)
        
        self.mapper.addMapping(self.nameEdit, 0)
        self.mapper.addMapping(self.addressEdit, 1)
        self.mapper.addMapping(self.typeComboBox, 2)

        # Connexions
        self.connect(self.previousButton, QtCore.SIGNAL("clicked()"),
                     self.mapper, QtCore.SLOT("toPrevious()"))
        self.connect(self.nextButton, QtCore.SIGNAL("clicked()"),
                     self.mapper, QtCore.SLOT("toNext()"))
        self.connect(self.mapper, QtCore.SIGNAL("currentIndexChanged(int)"),
                     self.updateButtons)

        self.mapper.toFirst() # Nécessaire au premier lancement 

        # Layout
        self.createLayout()

    def setupModel(self):
        """Crée le modèle"""
        self.model=QtGui.QStandardItemModel(5, 3, self)
        
        names=["Alice", "Bob", "Carol", "Donald", "Emma"]
        address=["0","1","2","0","2"]

        for row in range(0,5):
            item=QtGui.QStandardItem(names[row])
            self.model.setItem(row, 0, item)
            
            item=QtGui.QStandardItem(address[row])
            self.model.setItem(row, 2, item)

        self.typeModel=QtGui.QStringListModel(["Home", "Work", "Other"])

    def updateButtons(self, index):
        """Met à jour l'état des boutons si nécessaire"""
        self.previousButton.setEnabled(index>0)
        self.nextButton.setEnabled(index<self.model.rowCount()-1)

    def createLayout(self):
        """Positionne les widgets"""
        self.mainLayout=QtGui.QGridLayout(self)
        
        self.mainLayout.addWidget(self.nameLabel, 0,0)
        self.mainLayout.addWidget(self.nameEdit, 0,1)
        
        self.mainLayout.addWidget(self.addressLabel, 1,0, QtCore.Qt.AlignTop)
        self.mainLayout.addWidget(self.addressEdit, 1,1)
        
        self.mainLayout.addWidget(self.typeComboBox, 2,1)
        
        self.mainLayout.addWidget(self.nextButton, 1,2, QtCore.Qt.AlignTop)
        self.mainLayout.addWidget(self.previousButton, 0,2)
        
        self.setLayout(self.mainLayout)

class Delegate(QtGui.QItemDelegate):
    def __init__(self, parent=None):
        QtGui.QItemDelegate.__init__(self, parent=None)

    def setEditorData(self, editor, index):
        if not (editor.metaObject().userProperty().isValid()) :
            if editor.property("currentIndex") is not None:
                editor.setProperty("currentIndex", index.data())
                return
        QtGui.QItemDelegate.setEditorData(self, editor, index)

    def setModelData(self, editor, model, index):
        if not (editor.metaObject().userProperty().isValid()):
            value=editor.property("currentIndex")
            if value is not None:
                model.setData(index, value)
                return
        QtGui.QItemDelegate.setModelData(self, editor, model, index)                
        
if __name__=="__main__":
    app=QtGui.QApplication(sys.argv)
    window=Window(None)
    window.show()
    sys.exit(app.exec_())
