diff --git a/controller/KissCount.cpp b/controller/KissCount.cpp index d4e6f7a..2466319 100644 --- a/controller/KissCount.cpp +++ b/controller/KissCount.cpp @@ -116,3 +116,30 @@ void KissCount::DeleteAccount(struct Account ac) if (it->id == ac.id) _user->_accounts.erase(_user->_accounts.begin()+i); } + +void KissCount::AddCategory(wxString name, wxColour colour) +{ + wxString color; + color = _("#") ; + color += wxString::Format(_("%02X"), colour.Red()); + color += wxString::Format(_("%02X"), colour.Green()); + color += wxString::Format(_("%02X"), colour.Blue()); + + _db->AddCategory(_user, name, color); +} + +void KissCount::UpdateCategory(wxString oldName, wxString name, wxColour colour) +{ + wxString color; + color = _("#") ; + color += wxString::Format(_("%02X"), colour.Red()); + color += wxString::Format(_("%02X"), colour.Green()); + color += wxString::Format(_("%02X"), colour.Blue()); + + _db->UpdateCategory(_user, oldName, name, color); +} + +void KissCount::DeleteCategory(wxString name) +{ + _db->DeleteCategory(_user, name); +} diff --git a/controller/KissCount.h b/controller/KissCount.h index 29769ee..d2f5f15 100644 --- a/controller/KissCount.h +++ b/controller/KissCount.h @@ -18,17 +18,24 @@ class KissCount std::list GetUsers(); bool IsValidUser(wxString user, wxString password); void LoadUser(wxString user); - void LoadYear(int year, bool force=false); User* GetUser(); - double GetAccountAmount(wxString id, int month, int year); - void UpdateOperation(struct operation op); + + void LoadYear(int year, bool force=false); + wxString AddOperation(struct operation op); + void UpdateOperation(struct operation op); void DeleteOperation(struct operation op); + + double GetAccountAmount(wxString id, int month, int year); void SetAccountAmount(int month, int year, wxString accountId, double value); void AddAccount(struct Account ac); void UpdateAccount(struct Account ac); void DeleteAccount(struct Account ac); + void AddCategory(wxString name, wxColour colour); + void UpdateCategory(wxString oldName, wxString name, wxColour colour); + void DeleteCategory(wxString name); + private: wxUI* _wxUI; Database* _db; diff --git a/model/Database.cpp b/model/Database.cpp index 015b052..284f8c7 100644 --- a/model/Database.cpp +++ b/model/Database.cpp @@ -436,3 +436,80 @@ void Database::DeleteAccount(struct Account ac) EXECUTE_SQL_UPDATE(req, ); } + +void Database::AddCategory(User* user, wxString name, wxString color) +{ + wxString req; + + req = _("INSERT INTO preference ('user', 'type', 'name', 'value') VALUES ('") ; + req += user->_id + _("'"); + req += _(", 'category'"); + req += _(", 'name'"); + req += _(", '") + name + _("'"); + req += _(")"); + + EXECUTE_SQL_UPDATE(req, ); + + req = _("INSERT INTO preference ('user', 'type', 'name', 'value') VALUES ('") ; + req += user->_id + _("'"); + req += _(", 'category_color'"); + req += _(", '") + name + _("'"); + req += _(", '") + color + _("'"); + req += _(")"); + + EXECUTE_SQL_UPDATE(req, ); +} + +void Database::UpdateCategory(User* user, wxString oldName, wxString name, wxString color) +{ + wxString req; + + if (oldName != name) + { + req = _("UPDATE preference SET ") ; + req += _("value='") + name + _("'"); + req += _(" WHERE user='") + user->_id + _("'"); + req += _(" AND type='category'"); + req += _(" AND name='name'"); + req += _(" AND value='") + oldName + _("'"); + + EXECUTE_SQL_UPDATE(req, ); + } + + req = _("UPDATE preference SET ") ; + req += _("value='") + color + _("'"); + req += _(" WHERE user='") + user->_id + _("'"); + req += _(" AND type='category_color'"); + req += _(" AND name='") + oldName + _("'"); + + EXECUTE_SQL_UPDATE(req, ); + + if (oldName != name) + { + req = _("UPDATE preference SET ") ; + req += _("name='") + name + _("'"); + req += _(" WHERE user='") + user->_id + _("'"); + req += _(" AND type='category_color'"); + req += _(" AND name='") + oldName + _("'"); + req += _(" AND value='") + color + _("'"); + + EXECUTE_SQL_UPDATE(req, ); + } +} + +void Database::DeleteCategory(User* user, wxString name) +{ + wxString req; + req = _("DELETE FROM preference WHERE user='") + user->_id + _("'"); + req += _(" AND type='category'"); + req += _(" AND name='name'"); + req += _(" AND value='") + name + _("'"); + + EXECUTE_SQL_UPDATE(req, ); + + req = _("DELETE FROM preference WHERE user='") + user->_id + _("'"); + req += _(" AND type='category_color'"); + req += _(" AND name='") + name + _("'"); + + EXECUTE_SQL_UPDATE(req, ); +} diff --git a/model/Database.h b/model/Database.h index 35bc076..b630c01 100644 --- a/model/Database.h +++ b/model/Database.h @@ -34,6 +34,10 @@ class Database void UpdateAccount(struct Account ac); void DeleteAccount(struct Account ac); + void AddCategory(User* user, wxString name, wxString color); + void UpdateCategory(User* user, wxString oldName, wxString name, wxString color); + void DeleteCategory(User* user, wxString name); + private: wxSQLite3Database _db; diff --git a/view/PreferencesPanel.cpp b/view/PreferencesPanel.cpp index d8376e4..eef4435 100644 --- a/view/PreferencesPanel.cpp +++ b/view/PreferencesPanel.cpp @@ -158,11 +158,17 @@ void PreferencesPanel::InitCategories(User* user) _categoriesGrid->SetCellAlignment(curLine, CATEGORY_COLOR, wxALIGN_CENTRE, wxALIGN_CENTRE); _categoriesGrid->SetCellAlignment(curLine, CATEGORY_FONT, wxALIGN_CENTRE, wxALIGN_CENTRE); _categoriesGrid->SetCellAlignment(curLine, CATEGORY_DELETE, wxALIGN_CENTRE, wxALIGN_CENTRE); + + _categoriesIndexes[curLine] = it->second; } _categoriesGrid->SetReadOnly(0, CATEGORY_DELETE, true); _categoriesGrid->AutoSizeColumns(true); + _categoriesGrid->AppendRows(); + _categoriesGrid->SetReadOnly(curLine, CATEGORY_COLOR, true); + _categoriesGrid->SetReadOnly(curLine, CATEGORY_FONT, true); + _categoriesGrid->SetReadOnly(curLine, CATEGORY_DELETE, true); SET_ROW_COLOR(curLine, OWN_GREEN); } @@ -316,4 +322,75 @@ void PreferencesPanel::OnAccountModified(wxGridEvent& event) void PreferencesPanel::OnCategoryModified(wxGridEvent& event) { + int op_complete = 1; + wxString value, categoryName ; + User* user = _kiss->GetUser(); + int row = event.GetRow(); + int col = event.GetCol(); + static bool inModification = false ; + + if (inModification) return; + + inModification = true; + + value = _categoriesGrid->GetCellValue(row, CATEGORY_NAME); + if (value != _("")) + { + categoryName = value; + op_complete--; + } + + // Categories modification + if (user->GetCategoriesNumber() && row < user->GetCategoriesNumber()) + { + if (col == CATEGORY_DELETE) + { + wxMessageDialog dialog(_wxUI, _("Are you sure want to delete : \n")+categoryName, _("KissCount"), wxYES_NO); + if (dialog.ShowModal() == wxID_NO) + { + _categoriesGrid->SetCellValue(row, col, _("0")); + } + else + { + _categoriesIndexes.erase(row); + _categoriesGrid->DeleteRows(row, 1); + _kiss->DeleteCategory(categoryName); + } + + _wxUI->Layout(); + inModification = false; + return; + } + _kiss->UpdateCategory(_categoriesIndexes[row], categoryName, _categoriesGrid->GetCellBackgroundColour(row, col)); + } + // New category + else + { + if (op_complete) + { + inModification = false; + return ; + } + + _categoriesIndexes[row] = categoryName; + _kiss->AddCategory(categoryName, _categoriesGrid->GetCellBackgroundColour(row, col)); + _categoriesGrid->SetReadOnly(row, CATEGORY_COLOR, false); + _categoriesGrid->SetReadOnly(row, CATEGORY_FONT, false); + _categoriesGrid->SetReadOnly(row, CATEGORY_DELETE, false); + _categoriesGrid->SetCellRenderer(row, CATEGORY_DELETE, new wxGridCellBoolRenderer ()); + _categoriesGrid->SetCellEditor(row, CATEGORY_DELETE, new wxGridCellBoolEditor ()); + + _categoriesGrid->SetCellAlignment(row, CATEGORY_COLOR, wxALIGN_CENTRE, wxALIGN_CENTRE); + _categoriesGrid->SetCellAlignment(row, CATEGORY_FONT, wxALIGN_CENTRE, wxALIGN_CENTRE); + _categoriesGrid->SetCellAlignment(row, CATEGORY_DELETE, wxALIGN_CENTRE, wxALIGN_CENTRE); + + row++; + _categoriesGrid->AppendRows(); + _categoriesGrid->SetReadOnly(row, CATEGORY_COLOR, true); + _categoriesGrid->SetReadOnly(row, CATEGORY_FONT, true); + _categoriesGrid->SetReadOnly(row, CATEGORY_DELETE, true); + SET_ROW_COLOR(row, OWN_GREEN); + } + + return; }