/* 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 . */ #include #include #include #include #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; iappend(_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; isetItem(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 slices = series->slices(); for(i=0; iGetCategoriesNumber(); 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(); }