KissCount/src/view/CostRepartitionBanner.cpp

170 lines
4.8 KiB
C++

/*
Copyright 2010-2013 Grégory Soutadé
This file is part of KissCount.
KissCount is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
KissCount is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with KissCount. If not, see <http://www.gnu.org/licenses/>.
*/
#include <QtCharts/QChartView>
#include <QtCharts/QPieSeries>
#include <QtCharts/QPieSlice>
#include <QHeaderView>
#include "CostRepartitionBanner.hpp"
using namespace QtCharts;
CostRepartitionBanner::CostRepartitionBanner(KissCount* kiss, QFrame* parent, QString* categories) : QFrame(parent), _kiss(kiss), _categories(categories)
{
User* user = _kiss->GetUser();
int nbCategories, i;
QVBoxLayout *vbox = new QVBoxLayout;
setLayout(vbox);
nbCategories = user->GetCategoriesNumber();
QPieSeries *series = new QPieSeries();
QPieSlice* slice;
_pie = new QChart();
QPen pen;
pen.setWidth(2);
pen.setColor(Qt::black);
QLegend* legend = _pie->legend();
legend->detachFromChart();
legend->setAlignment(Qt::AlignTop);
legend->setVisible(false);
legend->setShowToolTips(true);
_pie->setMargins(QMargins(5, 5, 5, 5));
/* Ignore fix category */
for(i=1; i<nbCategories; i++)
{
slice = series->append(_categories[i], 0);
if (i < wxUI::MAX_CATEGORY)
slice->setBrush(QBrush(wxUI::categoryColors[i]));
slice->setLabelVisible(false);
}
_pie->addSeries(series);
_statsGrid = new QTableWidget(this);
_statsGrid->verticalHeader()->setHidden(true);
_statsGrid->horizontalHeader()->setHidden(true);
_statsGrid->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
_statsGrid->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
_statsGrid->setMaximumHeight( 300 );
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
QChartView *chartView = new QChartView(_pie);
chartView->setRenderHint(QPainter::Antialiasing);
QHBoxLayout *hbox = new QHBoxLayout;
hbox->addStretch();
hbox->addWidget(_statsGrid);
hbox->addStretch();
vbox->addLayout(hbox);
vbox->addWidget(chartView);
setMaximumWidth(450);
}
void CostRepartitionBanner::Reset()
{
int i;
User* user = _kiss->GetUser();
int nb_categories = user->GetCategoriesNumber();
if (!_statsGrid->rowCount())
{
_statsGrid->setColumnCount(2);
//_statsGrid->EnableEditing(false);
}
else
{
_statsGrid->clear();
}
_statsGrid->setRowCount(nb_categories+1); // categories + non fix
_statsGrid->setItem(1, 0, new QTableWidgetItem(_("Non fix")));
_statsGrid->setItem(1, 1, new QTableWidgetItem(""));
_statsGrid->item(1, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
for(i=0; i<nb_categories; i++)
{
if (!i)
{
_statsGrid->setItem(i, 0, new QTableWidgetItem(_categories[i]));
_statsGrid->setItem(i, 1, new QTableWidgetItem(""));
_statsGrid->item(i, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
}
else
{
_statsGrid->setItem(i+1, 0, new QTableWidgetItem(_categories[i]));
_statsGrid->setItem(i+1, 1, new QTableWidgetItem(""));
_statsGrid->item(i+1, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
}
}
_statsGrid->resizeColumnToContents(0);
}
void CostRepartitionBanner::UpdateCosts(int *categoriesValues, int totalDebit)
{
int i;
User* user = _kiss->GetUser();
unsigned long value, percents, utotalDebit = totalDebit;
QString v;
QPieSeries* series = (QPieSeries*) (_pie->series()[0]);
QList<QtCharts::QPieSlice*> slices = series->slices();
for(i=0; i<user->GetCategoriesNumber(); i++)
{
if (totalDebit != 0)
{
percents = ((categoriesValues[i]*(unsigned long)100))/utotalDebit;
}
else
percents = 0.0;
if (!i)
_statsGrid->item(i, 1)->setText(v.sprintf("%.2lf (%02d %%)", (double)categoriesValues[i]/100, (int)percents));
else
{
_statsGrid->item(i+1, 1)->setText(v.sprintf("%.2lf (%02d %%)", (double)categoriesValues[i]/100, (int)percents));
slices[i-1]->setValue(categoriesValues[i] / 100);
slices[i-1]->setLabelVisible(categoriesValues[i] != 0.0);
}
}
value = totalDebit - categoriesValues[0];
if (totalDebit != 0)
percents = (value*100)/totalDebit;
else
percents = 0.0;
_statsGrid->item(1, 1)->setText(v.sprintf("%.2lf (%02d %%)", (double)value/100, (int)percents));
_statsGrid->resizeColumnsToContents();
}