PieChartDataModel Example

import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../shared")

from DevMachines import __pyside2__, __pyside6__
from DevMachines.QtitanBase import Qtitan
from DevMachines.QtitanChart import (Chart, ChartPieSeries2D)

if __pyside2__:
    from PySide2 import QtCore
    from PySide2.QtCore import Qt
    from PySide2.QtGui import QBrush, QIcon
    from PySide2.QtWidgets import (QApplication, QComboBox, QAbstractItemView,
        QTableWidgetSelectionRange, QTableWidget, QTableWidgetItem, QToolBar, QHeaderView)

if __pyside6__:
    from PySide6 import QtCore
    from PySide6.QtCore import Qt
    from PySide6.QtGui import QBrush, QIcon
    from PySide6.QtWidgets import (QApplication, QComboBox, QAbstractItemView,
        QTableWidgetSelectionRange, QTableWidget, QTableWidgetItem, QToolBar, QHeaderView)

from DemoChartWindow import DemoChartWindow

import PieChartDataModel_rc

class MainWindow(DemoChartWindow):
    SelectionDataModel = 0
    EditDataModel = 1

    def __init__(self):
        DemoChartWindow.__init__(self, "Pie Chart with Model")
        self.columnCount = 3
        self.rowCount = 12
        self.orientation = Qt.Vertical
        self.setChart(self.createChart(), self.createDataBindingWidget())
        self.createSeriesParametrs()
        self.seriesChanged(self.seriesSwitcher.currentIndex())

    def createChart(self):
        return Chart(self)

    def createDataBindingWidget(self):
        self.tableWidget = QTableWidget(self)
        self.tableWidget.setMaximumWidth(250)
        self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        return self.tableWidget

    def createSeriesParametrs(self):
        dataBindingGroup = self.createGroupParameters(self.tr("Data Binding"))
        formLayout = dataBindingGroup.layout()
        self.seriesSwitcher = QComboBox(dataBindingGroup)
        self.seriesSwitcher.addItem("Selection Model", MainWindow.SelectionDataModel)
        self.seriesSwitcher.addItem("Edit Model", MainWindow.EditDataModel)
        self.connect(self.seriesSwitcher, QtCore.SIGNAL("currentIndexChanged(int)"), self,
            QtCore.SLOT("seriesChanged(int)"))
        formLayout.addRow(self.seriesSwitcher)

        self.toolBar = QToolBar(self)
        self.actAppendRow = self.toolBar.addAction(QIcon(":\\shared\\res\\appendrow.png"), self.tr("Append Row"))
        self.actAppendRow.setEnabled(False)
        self.connect(self.actAppendRow, QtCore.SIGNAL("triggered()"), self, QtCore.SLOT("appendRow()"))
        self.actDeleteRow = self.toolBar.addAction(QIcon(":\\shared\\res\\deleterow.png"), self.tr("Delete Row"))
        self.actDeleteRow.setEnabled(False)
        self.connect(self.actDeleteRow, QtCore.SIGNAL("triggered()"), self, QtCore.SLOT("deleteRow()"))

        formLayout.addRow(self.toolBar)

    def createSelectionModelSeries(self):
        self.disconnect(self.tableWidget, QtCore.SIGNAL("itemSelectionChanged()"), self, QtCore.SLOT("updateEnableButtons()"))
        self.connect(self.tableWidget, QtCore.SIGNAL("itemSelectionChanged()"), self, QtCore.SLOT("setSelectionData()"))

        self.createTitle(self.tr("Selection Data Model"))
        self.chart.legend().setVisible(True)

        series = ChartPieSeries2D()
        self.chart.appendSeries(series)
        series.modelController().setModel(self.tableWidget.model())

    def createEditModelSeries(self):
        self.disconnect(self.tableWidget, QtCore.SIGNAL("itemSelectionChanged()"), self, QtCore.SLOT("setSelectionData()"))
        self.connect(self.tableWidget, QtCore.SIGNAL("itemSelectionChanged()"), self, QtCore.SLOT("updateEnableButtons()"))
        self.createTitle(self.tr("Edit Data Model"))
        self.chart.legend().setVisible(True)
        series = ChartPieSeries2D()
        self.chart.appendSeries(series)
        series.modelController().setModel(self.tableWidget.model())

    def fillPieDataTable(self):
        self.tableWidget.clear()
        self.tableWidget.setColumnCount(self.columnCount)
        self.tableWidget.setRowCount(self.rowCount)

        for i in range(0, self.rowCount):
            for k in range(0, self.columnCount):
                item = QTableWidgetItem()
                value = 0
                if k == 0:
                    value = self.getRandomValue(10, 30)
                    item.setText("{}".format(value))
                    self.tableWidget.setItem(i, k, item)
                else:
                    item.setText("{} January".format(i + 1))
                    self.tableWidget.setItem(i, k, item)

    def initSelectionRange(self):
        self.tableWidget.clearSelection()
        _range = QTableWidgetSelectionRange(0, 0, self.rowCount-1, 1)
        self.tableWidget.setRangeSelected(_range, True)

    def updateValueParameters(self):
        DemoChartWindow.updateValueParameters(self)

    def seriesChanged(self, index):
        self.chart.clearSeries()
        self.chart.clearTitles()
        self.chart.setBackgroundBrush(QBrush())

        v = self.seriesSwitcher.itemData(index)
        if int(v) == MainWindow.SelectionDataModel:
            self.tableWidget.clearSelection()
            self.tableWidget.setSelectionMode(QAbstractItemView.ContiguousSelection)
            self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
            self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
            self.toolBar.hide()
            self.columnCount = 2
            self.rowCount = 15
            self.fillPieDataTable()
            self.createSelectionModelSeries()
            self.initSelectionRange()
        elif int(v) == MainWindow.EditDataModel:
            self.tableWidget.clearSelection()
            self.tableWidget.setSelectionMode(QAbstractItemView.SingleSelection)
            self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
            self.tableWidget.setEditTriggers(QAbstractItemView.AllEditTriggers)
            self.toolBar.show()
            self.columnCount = 2
            self.rowCount = 6
            self.fillPieDataTable()
            self.createEditModelSeries()
        self.updateValueParameters()

    @QtCore.Slot()
    def setSelectionData(self):
        if len(self.chart.series()) == 0:
            return
        series = self.chart.series()[0]

        if series.inherits("Qtitan::ChartPieSeries2D"):
            selectedRanges = self.tableWidget.selectedRanges()
            if len(selectedRanges) == 1:
                selected = selectedRanges[0]
                if selected.leftColumn() == selected.rightColumn():
                    series.modelController().setAxisXColumn(-1)
                else:
                    series.modelController().setAxisXColumn(selected.leftColumn())

                series.modelController().setAxisYColumn(selected.rightColumn())
                series.modelController().setRowRange(selected.topRow(), selected.bottomRow())
            else:
                series.modelController().setRowRange(-1, -1)

    @QtCore.Slot()
    def appendRow(self):
        if len(self.chart.series()) == 0:
            return

        numNewRow = 0

        selectedRanges = self.tableWidget.selectedRanges()
        if len(selectedRanges) > 0:
            indexEdit = self.tableWidget.currentIndex()
            if indexEdit.isValid():
                itemEdit = self.tableWidget.item(indexEdit.row(), indexEdit.column())
                if not itemEdit is None:
                    self.tableWidget.closePersistentEditor(itemEdit)
            self.tableWidget.reset()

            selected = selectedRanges[len(selectedRanges)-1]
            numNewRow = selected.topRow() + 1

        self.rowCount = self.rowCount + 1
        self.tableWidget.insertRow(numNewRow)

        itemX = QTableWidgetItem()
        itemX.setText("{}".format(1))
        self.tableWidget.setItem(numNewRow, 0, itemX)

        itemY = QTableWidgetItem()
        itemY.setText("{}".format(self.tr("Test")))
        self.tableWidget.setItem(numNewRow, 1, itemY)

        _range = QTableWidgetSelectionRange(numNewRow, 0, numNewRow, self.columnCount-1)
        self.tableWidget.setRangeSelected(_range, True)

        index = self.tableWidget.model().index(numNewRow, 0)
        if index.isValid():
            self.tableWidget.setCurrentIndex(index)
            self.tableWidget.edit(index)

        series = self.chart.series()[0]
        series.modelController().setColumnRange(0, self.rowCount-1)

    @QtCore.Slot()
    def deleteRow(self):
        if len(self.chart.series()) == 0:
            return

        selectedRanges = self.tableWidget.selectedRanges()
        for selected in selectedRanges:
            self.tableWidget.removeRow(selected.topRow())
            self.rowCount = self.rowCount - 1
            series = self.chart.series()[0]
            series.modelController().setColumnRange(0, self.rowCount-1)
        self.updateEnableButtons()

    @QtCore.Slot()
    def updateEnableButtons(self):
        if len(self.chart.series()) == 0:
            return

        if self.orientation == Qt.Horizontal:
            isEmpty = self.tableWidget.model().columnCount() == 0
        else:
            isEmpty = self.tableWidget.model().rowCount() == 0

        selectedRanges = self.tableWidget.selectedRanges()
        self.actDeleteRow.setEnabled(len(selectedRanges) > 0)
        self.actAppendRow.setEnabled(isEmpty or len(selectedRanges) > 0)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())