Extract cost repartition banner

This commit is contained in:
Grégory Soutadé 2013-02-26 12:17:35 +01:00
parent 0d80d91a47
commit 2ec5e124da
5 changed files with 230 additions and 111 deletions

View File

@ -1,12 +1,12 @@
v0.4 (17/02/2013)
** User **
Add icons for low resolution
Add icons for low resolution screens
Sort categories using translated names
Set DateFrom to first of month for SearchBanner
Add CSV export
** Dev **
Primitive handle of low resolutions
Primitive handle of low resolution screens
Rework GridAccount
Simplify UpdateNextMonths function
Add "create_if_not_exsits" to Database::GetAccountAmount

View File

@ -20,8 +20,6 @@
#include <QHeaderView>
#include <QGroupBox>
#include <QMessageBox>
#include <KDChartLegend>
#include <KDChartPieDiagram>
#include "AccountPanel.hpp"
#include "grid/FloatDelegate.hpp"
@ -29,7 +27,7 @@
#include "SnapshotsDialog.hpp"
enum {ACCOUNT_NUMBER, ACCOUNT_NAME, ACCOUNT_INIT, ACCOUNT_CUR, ACCOUNT_FINAL, NUMBER_COLS_ACCOUNTS};
enum {CUR_CREDIT, CUR_DEBIT, TOTAL_CREDIT, TOTAL_DEBIT, BALANCE, STATS_ROW, CATS_STATS, NON_FIX};
enum {CUR_CREDIT, CUR_DEBIT, TOTAL_CREDIT, TOTAL_DEBIT, BALANCE, CATS_STATS};
enum {VIRTUAL_MODE=0, REAL_MODE, CHECK_MODE};
@ -51,12 +49,10 @@ void AccountPanel::Init(KissCount* kiss, wxUI *parent, int curMode)
QVBoxLayout *vbox = new QVBoxLayout;
QVBoxLayout *vbox2 = new QVBoxLayout;
QVBoxLayout *vbox3 = new QVBoxLayout;
// wxChartPanel* chart ;
int i ;
int i;
User* user = _kiss->GetUser();
std::vector<Account>::iterator accountIt;
std::vector<Category>::iterator categoryIt;
int nbCategories;
_icons[KissPanel::LOW_RES_ICON] = USER_LOW_ICON;
_icons[KissPanel::HIGH_RES_ICON] = USER_ICON;
@ -70,8 +66,6 @@ void AccountPanel::Init(KissCount* kiss, wxUI *parent, int curMode)
_tree->setContextMenuPolicy(Qt::CustomContextMenu);
connect(_tree, SIGNAL(customContextMenuRequested ( const QPoint & )), this, SLOT(OnTreeRightClick(const QPoint &)));
// ColorScheme* colorScheme = new ColorScheme(wxUI::categoryColors, WXSIZEOF(wxUI::categoryColors));
_calendar = new QCalendarWidget(this);
_calendar->setGridVisible(false);
_calendar->setFirstDayOfWeek(Qt::Monday);
@ -96,48 +90,7 @@ void AccountPanel::Init(KissCount* kiss, wxUI *parent, int curMode)
_categoriesIndexes[categoryIt->name] = i;
}
nbCategories = user->GetCategoriesNumber();
// nbCategories = (user->GetCategoriesNumber() <= wxUI::MAX_CATEGORY) ? user->GetCategoriesNumber() : wxUI::MAX_CATEGORY;
_pie = new KDChart::Widget();
_pie->setType( KDChart::Widget::Pie );
QPen pen;
pen.setWidth(2);
pen.setColor(Qt::black);
_pie->pieDiagram()->setPen(pen);
_pie->addLegend(KDChart::Position::South);
KDChart::Legend* legend = _pie->legend();
// legend->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
legend->setOrientation( Qt::Vertical );
legend->setTitleText( _("Cost repartition") );
QVector< double > vec;
vec << 0.0;
_dataset = new QStandardItemModel(nbCategories, 2, this);
_categoriesValues = new int[nbCategories];
for(i=0; i<nbCategories; i++)
{
_categoriesValues[i] = 0.0;
_pie->setDataset( i, vec, _categories[i] );
_pie->pieDiagram()->setBrush(i, QBrush(wxUI::categoryColors[i]));
legend->setText( i, _categories[i] );
_dataset->setData(_dataset->index(i, 0, QModelIndex()), _categories[i]);
_dataset->setData(_dataset->index(i, 1, QModelIndex()), 0.0);
if (i < wxUI::MAX_CATEGORY)
_dataset->setData(_dataset->index(i, 0, QModelIndex()), wxUI::categoryColors[i], Qt::DecorationRole);
}
_pie->setMaximumSize( 200, 400 );
KDChart::TextAttributes legendTextAttr(legend->textAttributes());
legendTextAttr.setFontSize(64);
legendTextAttr.setAutoShrink(true);
legend->setTextAttributes(legendTextAttr);
legendTextAttr = KDChart::TextAttributes(legend->titleTextAttributes());
legendTextAttr.setFontSize(64);
legendTextAttr.setAutoShrink(true);
legend->setTitleTextAttributes(legendTextAttr);
_categoriesValues = new int[user->GetCategoriesNumber()];
_grid = new GridAccount(_kiss, this, true, true, true);
_grid->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
@ -155,8 +108,10 @@ void AccountPanel::Init(KissCount* kiss, wxUI *parent, int curMode)
_statsGrid = new QTableWidget(this);
_statsGrid->verticalHeader()->setHidden(true);
_statsGrid->horizontalHeader()->setHidden(true);
_statsGrid->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
_statsGrid->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
_costRepartitionBanner = new CostRepartitionBanner(_kiss, this, _categories);
QGroupBox *groupBox = new QGroupBox(_("Mode"));
_virtual = new QRadioButton(_("Virtual"));
@ -212,15 +167,12 @@ void AccountPanel::Init(KissCount* kiss, wxUI *parent, int curMode)
vbox2->addWidget(_grid, 1);
hbox->addLayout(vbox2);
vbox->addWidget(_statsGrid);
vbox->addWidget(_pie);
vbox->addWidget(_costRepartitionBanner);
hbox->addLayout(vbox);
ChangeUser();
layout();
QSize s = legend->sizeHint();
legend->setMaximumSize(s.width(), s.height()/3);
}
AccountPanel::~AccountPanel()
@ -248,8 +200,6 @@ QString AccountPanel::GetToolTip()
void AccountPanel::InitStatsGrid(User* user)
{
int i;
int nb_categories = user->GetCategoriesNumber();
DEFAULT_FONT(font);
if (!_statsGrid->rowCount())
@ -261,27 +211,11 @@ void AccountPanel::InitStatsGrid(User* user)
{
_statsGrid->clear();
}
_statsGrid->setRowCount(nb_categories+CATS_STATS+1); // Headers + blank + categories + non fix
_statsGrid->setRowCount(CATS_STATS); // Headers
_statsGrid->setItem(TOTAL_CREDIT, 0, new QTableWidgetItem(_("Total Credit")));
_statsGrid->setItem(TOTAL_DEBIT, 0, new QTableWidgetItem(_("Total Debit")));
for(i=0; i<nb_categories; i++)
{
if (i)
{
_statsGrid->setItem(CATS_STATS+i+1, 0, new QTableWidgetItem(_categories[i]));
_statsGrid->setItem(CATS_STATS+i+1, 1, new QTableWidgetItem(""));
_statsGrid->item(CATS_STATS+i+1, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
}
else
{
_statsGrid->setItem(CATS_STATS+i, 0, new QTableWidgetItem(_categories[i]));
_statsGrid->setItem(CATS_STATS+i, 1, new QTableWidgetItem(""));
_statsGrid->item(CATS_STATS+i, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
}
}
font.setBold(true);
_statsGrid->setItem(CUR_CREDIT, 0, new QTableWidgetItem(_("Cur Credit")));
@ -289,14 +223,12 @@ void AccountPanel::InitStatsGrid(User* user)
_statsGrid->setItem(TOTAL_CREDIT, 0, new QTableWidgetItem(_("Total Credit")));
_statsGrid->setItem(TOTAL_DEBIT, 0, new QTableWidgetItem(_("Total Debit")));
_statsGrid->setItem(BALANCE, 0, new QTableWidgetItem(_("Balance")));
_statsGrid->setItem(NON_FIX, 0, new QTableWidgetItem(_("Non fix")));
_statsGrid->setItem(CUR_CREDIT, 1, new QTableWidgetItem(""));
_statsGrid->setItem(CUR_DEBIT, 1, new QTableWidgetItem(""));
_statsGrid->setItem(TOTAL_CREDIT, 1, new QTableWidgetItem(""));
_statsGrid->setItem(TOTAL_DEBIT, 1, new QTableWidgetItem(""));
_statsGrid->setItem(BALANCE, 1, new QTableWidgetItem(""));
_statsGrid->setItem(NON_FIX, 1, new QTableWidgetItem(""));
_statsGrid->item(CUR_DEBIT, 0)->setFont(font);
_statsGrid->item(CUR_CREDIT, 0)->setFont(font);
@ -308,9 +240,10 @@ void AccountPanel::InitStatsGrid(User* user)
_statsGrid->item(TOTAL_CREDIT, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
_statsGrid->item(TOTAL_DEBIT, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
_statsGrid->item(BALANCE, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
_statsGrid->item(NON_FIX, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
_statsGrid->resizeColumnToContents(0);
_costRepartitionBanner->Reset();
}
void AccountPanel::ChangeUser()
@ -572,6 +505,7 @@ void AccountPanel::UpdateStats()
Operation op;
bool blocked_account ;
QString v;
std::vector<Operation> operations;
_inModification = true;
@ -666,6 +600,7 @@ void AccountPanel::UpdateStats()
curAccountAmount[op.account] += op.amount;
finalAccountAmount[op.account] += op.amount;
}
operations.push_back(op);
}
balance = totalCredit - totalDebit;
@ -677,35 +612,6 @@ void AccountPanel::UpdateStats()
_statsGrid->item(BALANCE, 1)->setText(v.sprintf("%.2lf", (double)balance/100));
_statsGrid->item(BALANCE, 1)->setForeground((balance >= 0) ? QBrush(Qt::green) : QBrush(Qt::red));
// KDChart::Legend* legend = _pie->legend();
for(i=0; i<user->GetCategoriesNumber(); i++)
{
if (totalDebit != 0)
percents = (_categoriesValues[i]*100)/totalDebit;
else
percents = 0.0;
if (i)
_statsGrid->item(CATS_STATS+i+1, 1)->setText(v.sprintf("%.2lf (%02d %%)", (double)_categoriesValues[i]/100, (int)percents));
else
_statsGrid->item(CATS_STATS+i, 1)->setText(v.sprintf("%.2lf (%02d %%)", (double)_categoriesValues[i]/100, (int)percents));
QVector< double > vec;
vec << (double) _categoriesValues[i] / 100;
_pie->setDataset( i, vec, _categories[i] );
// if (_categoriesValues[i] == 0.0)
// legend->setDatasetHidden(i, true);
// else
// legend->setDatasetHidden(i, false);
// _dataset->setData(_dataset->index(i, 1, QModelIndex()), _categoriesValues[i]);
}
value = totalDebit - _categoriesValues[0];
if (totalDebit != 0)
percents = (value*100)/totalDebit;
else
percents = 0.0;
_statsGrid->item(NON_FIX, 1)->setText(v.sprintf("%.2lf (%02d %%)", (double)value/100, (int)percents));
for (i=0, accountIt=user->_accounts.begin(); accountIt!=user->_accounts.end(); accountIt++, i++)
{
if (accountIt->hidden)
@ -740,6 +646,8 @@ void AccountPanel::UpdateStats()
}
}
_costRepartitionBanner->UpdateCosts(operations, _categoriesValues, totalDebit);
_accountsGrid->resizeColumnToContents(ACCOUNT_INIT);
_accountsGrid->resizeColumnToContents(ACCOUNT_CUR);
_accountsGrid->resizeColumnToContents(ACCOUNT_FINAL);

View File

@ -25,12 +25,12 @@
#include <QTableWidget>
#include <QRadioButton>
#include <QStandardItemModel>
#include <KDChartWidget>
#include "view.hpp"
#include <model/model.hpp>
#include "grid/GridAccount.hpp"
#include "CostRepartitionBanner.hpp"
class GridAccount;
@ -76,14 +76,13 @@ private:
QCalendarWidget* _calendar;
GridAccount* _grid;
QTableWidget* _accountsGrid, *_statsGrid;
KDChart::Widget* _pie;
CostRepartitionBanner* _costRepartitionBanner;
int *_categoriesValues;
// wxRadioBox *_radioMode;
std::map<QString, int> _categoriesIndexes;
std::vector<Operation>* _curOperations;
QString* _categories, *_accounts;
std::map<int, int> _accountsInitValues;
QStandardItemModel* _dataset;
int _fixCosts;
QRadioButton *_virtual, *_real, *_check;
bool _inModification;

View File

@ -0,0 +1,165 @@
/*
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 <KDChartLegend>
#include <KDChartPieDiagram>
#include "CostRepartitionBanner.hpp"
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();
_pie = new KDChart::Widget();
_pie->setType( KDChart::Widget::Pie );
QPen pen;
pen.setWidth(2);
pen.setColor(Qt::black);
_pie->pieDiagram()->setPen(pen);
_pie->addLegend(KDChart::Position::South);
KDChart::Legend* legend = _pie->legend();
// legend->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
legend->setOrientation( Qt::Vertical );
legend->setTitleText( _("Cost repartition") );
QVector< double > vec;
vec << 0.0;
_dataset = new QStandardItemModel(nbCategories, 2, this);
for(i=0; i<nbCategories; i++)
{
_pie->setDataset( i, vec, _categories[i] );
_pie->pieDiagram()->setBrush(i, QBrush(wxUI::categoryColors[i]));
legend->setText( i, _categories[i] );
_dataset->setData(_dataset->index(i, 0, QModelIndex()), _categories[i]);
_dataset->setData(_dataset->index(i, 1, QModelIndex()), 0.0);
if (i < wxUI::MAX_CATEGORY)
_dataset->setData(_dataset->index(i, 0, QModelIndex()), wxUI::categoryColors[i], Qt::DecorationRole);
}
_pie->setMaximumSize( 200, 400 );
KDChart::TextAttributes legendTextAttr(legend->textAttributes());
legendTextAttr.setFontSize(64);
legendTextAttr.setAutoShrink(true);
legend->setTextAttributes(legendTextAttr);
legendTextAttr = KDChart::TextAttributes(legend->titleTextAttributes());
legendTextAttr.setFontSize(64);
legendTextAttr.setAutoShrink(true);
legend->setTitleTextAttributes(legendTextAttr);
_statsGrid = new QTableWidget(this);
_statsGrid->verticalHeader()->setHidden(true);
_statsGrid->horizontalHeader()->setHidden(true);
_statsGrid->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
QSize s = legend->sizeHint();
legend->setMaximumSize(s.width(), s.height()/3);
vbox->addWidget(_statsGrid);
vbox->addWidget(_pie);
setMaximumWidth(300);
}
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(""));
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(std::vector<Operation>& operations, int *categoriesValues, int totalDebit)
{
int i;
User* user = _kiss->GetUser();
int value, percents;
QString v;
for(i=0; i<user->GetCategoriesNumber(); i++)
{
if (totalDebit != 0)
percents = (categoriesValues[i]*100)/totalDebit;
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));
// KDChart::Legend* legend = _pie->legend();
QVector< double > vec;
vec << (double) categoriesValues[i] / 100;
_pie->setDataset( i, vec, _categories[i] );
// if (categoriesValues[i] == 0.0)
// legend->setDatasetHidden(i, true);
// else
// legend->setDatasetHidden(i, false);
// _dataset->setData(_dataset->index(i, 1, QModelIndex()), categoriesValues[i]);
}
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->resizeColumnToContents(1);
}

View File

@ -0,0 +1,47 @@
/*
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/>.
*/
#ifndef COSTREPARTITIONBANNER_H
#define COSTREPARTITIONBANNER_H
#include <QtGui>
#include <KDChartWidget>
#include "view.hpp"
#include <model/model.hpp>
class CostRepartitionBanner: public QFrame
{
Q_OBJECT;
public:
CostRepartitionBanner(KissCount* kiss, QFrame* parent, QString* categories);
void Reset();
void UpdateCosts(std::vector<Operation>& operations, int *categoriesValues, int totalDebit);
private:
KissCount* _kiss;
QString* _categories;
QTableWidget* _statsGrid;
KDChart::Widget* _pie;
QStandardItemModel* _dataset;
};
#endif