00001 #include <QtGui>
00002
00003 #ifndef M_PI
00004 #define M_PI 3.1415927
00005 #endif
00006
00007 #include "piechartview.h"
00008 #include "../Models/costunitmodel.h"
00009 #include "../Calculations/costunitproduct.h"
00010 #include "../Data/settings.h"
00011
00012 PieChartView::PieChartView(Settings *&set, QWidget *parent) : QAbstractItemView(parent)
00013 {
00014 horizontalScrollBar()->setRange(0, 0);
00015 verticalScrollBar()->setRange(0, 0);
00016
00017 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
00018 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
00019
00020 margin = 8;
00021 totalSize = 500;
00022 pieSize = totalSize - 2* margin;
00023 totalValue = 0.0;
00024
00025 settings = set;
00026 }
00027
00028 bool PieChartView::edit(const QModelIndex &index, EditTrigger trigger, QEvent *event)
00029 {
00030 return false;
00031 }
00032
00033 QModelIndex PieChartView::indexAt(const QPoint &point) const
00034 {
00035 return QModelIndex();
00036 }
00037
00038 bool PieChartView::isIndexHidden(const QModelIndex & ) const
00039 {
00040 return false;
00041 }
00042
00043 int PieChartView::horizontalOffset() const
00044 {
00045 return horizontalScrollBar()->value();
00046 }
00047
00048 QModelIndex PieChartView::moveCursor(QAbstractItemView::CursorAction cursorAction, Qt::KeyboardModifiers )
00049 {
00050 return QModelIndex();
00051 }
00052
00053 void PieChartView::paintEvent(QPaintEvent *event)
00054 {
00055 if(model())
00056 {
00057
00058 CostUnitModel *costunitmodel = ((CostUnitModel*)model());
00059 totalValue = costunitmodel->product()->grossSalesPriceWithSalesTax();
00060
00061 QList<double> items = costunitmodel->product()->dataList();
00062 if(totalValue > 0)
00063 {
00064 QStyleOptionViewItem option = viewOptions();
00065 QStyle::State state = option.state;
00066
00067 QBrush background = option.palette.base();
00068 QPen foreground(option.palette.color(QPalette::WindowText));
00069 QPen textPen(option.palette.color(QPalette::Text));
00070 QPen highlightedPen(option.palette.color(QPalette::HighlightedText));
00071
00072 QPainter painter(viewport());
00073 painter.setRenderHint(QPainter::Antialiasing);
00074
00075 painter.fillRect(event->rect(), background);
00076 painter.setPen(foreground);
00077
00078
00079 QRect pieRect = QRect(margin, margin, pieSize, pieSize);
00080 QPoint keyPoint = QPoint(totalSize - horizontalScrollBar()->value(), margin - verticalScrollBar()->value());
00081
00082 painter.save();
00083 painter.translate(pieRect.x() - horizontalScrollBar()->value(), pieRect.y() - verticalScrollBar()->value());
00084 painter.drawEllipse(0, 0, pieSize, pieSize);
00085 double startAngle = 0.0;
00086 uint totalPieces = 0;
00087
00088 for(int i = 0; i < items.count(); i++)
00089 {
00090 double value = items.value(i);
00091
00092 if(value > 0.0)
00093 {
00094 double angle = 360*value/totalValue;
00095
00096 QColor color;
00097 switch(i)
00098 {
00099 case 0:
00100 color = settings->productionCostsCUColor();
00101 break;
00102 case 1:
00103 color = settings->profitCUColor();
00104 break;
00105 case 2:
00106 color = settings->commissionCUColor();
00107 break;
00108 case 3:
00109 color = settings->tradeDiscountCUColor();
00110 break;
00111 case 4:
00112 color = settings->discountCUColor();
00113 break;
00114 case 5:
00115 color = settings->salesTaxCUColor();
00116 break;
00117 default:
00118 color = QColor(int(qrand() * 16));
00119 break;
00120 }
00121
00122 painter.setBrush(QBrush(color));
00123 painter.drawPie(0, 0, pieSize, pieSize, int(startAngle*16), int(angle*16));
00124
00125 startAngle += angle;
00126 totalPieces++;
00127 }
00128 }
00129 painter.restore();
00130 }
00131 }
00132 }
00133
00134 void PieChartView::resizeEvent(QResizeEvent *event)
00135 {
00136 if(viewport()->width() >= size().height())
00137 {
00138
00139 totalSize = size().height();
00140 }
00141 else
00142 {
00143
00144 totalSize = size().width() - margin/2;
00145 }
00146 pieSize = totalSize - 2 * margin;
00147 updateGeometries();
00148 }
00149
00150 int PieChartView::rows(const QModelIndex &index) const
00151 {
00152 return model()->rowCount(QModelIndex());
00153 }
00154
00155 void PieChartView::scrollContentsBy(int dx, int dy)
00156 {
00157 viewport()->scroll(dx, dy);
00158 }
00159
00160 void PieChartView::scrollTo(const QModelIndex &index, ScrollHint)
00161 {
00162 QRect area = viewport()->rect();
00163 QRect rect = visualRect(index);
00164
00165 if(rect.left() < area.left())
00166 {
00167 horizontalScrollBar()->setValue(horizontalScrollBar()->value() + rect.left() - area.left());
00168 }
00169 else if(rect.right() > area.right())
00170 {
00171 horizontalScrollBar()->setValue(horizontalScrollBar()->value() + qMin(rect.right() - area.right(), rect.left() - area.left()));
00172 }
00173
00174 if(rect.top() < area.top())
00175 {
00176 verticalScrollBar()->setValue(verticalScrollBar()->value() + rect.top() - area.top());
00177 }
00178 else if(rect.bottom() > area.bottom())
00179 {
00180 verticalScrollBar()->setValue(verticalScrollBar()->value() + qMin(rect.bottom() - area.bottom(), rect.top() - area.top()));
00181 }
00182
00183 update();
00184 }
00185
00186 void PieChartView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command)
00187 {
00188 }
00189
00190 void PieChartView::updateGeometries()
00191 {
00192 horizontalScrollBar()->setPageStep(viewport()->width());
00193 horizontalScrollBar()->setRange(0, qMax(0, totalSize - viewport()->width()));
00194 verticalScrollBar()->setPageStep(viewport()->height());
00195 verticalScrollBar()->setRange(0, qMax(0, totalSize - viewport()->height()));
00196 }
00197
00198 int PieChartView::verticalOffset() const
00199 {
00200 return verticalScrollBar()->value();
00201 }
00202
00203 QRect PieChartView::visualRect(const QModelIndex &index) const
00204 {
00205 return QRect();
00206 }
00207
00208 QRegion PieChartView::visualRegionForSelection(const QItemSelection &selection) const
00209 {
00210 return QRect();
00211 }