From 35f660b234f2645565e4a222e48e5493c4763a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20Soutad=C3=A9?= Date: Wed, 23 Mar 2011 20:35:29 +0100 Subject: [PATCH] Functionnal version of ImportPanel --- ChangeLog | 4 +- Makefile | 5 +- ressources/icons/SOURCE | 1 + ressources/icons/import-icon.png | Bin 0 -> 4894 bytes ressources/init.sql | 3 +- src/controller/KissCount.cpp | 5 ++ src/controller/KissCount.h | 1 + src/model/Database.cpp | 57 +++++++++++++++++ src/model/Database.h | 2 + src/model/Database_Update.cpp | 5 ++ src/model/User.h | 1 + src/model/import/ImportEngine.cpp | 61 ++++++++++++++---- src/model/import/ImportEngine.h | 12 ++-- src/model/import/OFXImportEngine.cpp | 17 +---- src/model/import/OFXImportEngine.h | 4 +- src/view/ImportPanel.cpp | 91 ++++++++++++++++++++++++--- src/view/ImportPanel.h | 3 + src/view/view.h | 1 + 18 files changed, 225 insertions(+), 48 deletions(-) create mode 100644 ressources/icons/import-icon.png diff --git a/ChangeLog b/ChangeLog index b36a622..f3ee6ce 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -v0.2 (06/03/2011) +v0.2 (23/03/2011) ** User ** Better use of sizers (so better interface!) @@ -14,6 +14,7 @@ v0.2 (06/03/2011) Add Real mode Database is now at ~/.kisscount/kc.bdd Add Debian's packages !! + Add Import Panel and OFX imports ** Dev ** Use a factory to create panels (prepare for plug-in) @@ -22,6 +23,7 @@ v0.2 (06/03/2011) New database version (2) : fix_cost for categories virtual field for account and operation + import_panel Database checking & upgrading ** Bugs ** diff --git a/Makefile b/Makefile index 1833740..52ae73f 100644 --- a/Makefile +++ b/Makefile @@ -7,8 +7,9 @@ CXXFLAGS+=`wx-config --cxxflags` -Wall -Isrc -ggdb CXXFLAGS+=-I./lib/wxsqlite3-1.9.9/include CXXFLAGS+=-I./lib/freechart/include CXXFLAGS+=-Wl,--rpath,"$(LIB_DIR)" -CXXFLAGS+=-DRESSOURCES_ROOT="\"$(SHARE_DIR)\"" -#CXXFLAGS+=-DRESSOURCES_ROOT="\"./ressources/\"" +#CXXFLAGS+=-DRESSOURCES_ROOT="\"$(SHARE_DIR)\"" +# For developpers +CXXFLAGS+=-DRESSOURCES_ROOT="\"./ressources/\"" LDFLAGS+=`wx-config --libs` LDFLAGS+=-lofx diff --git a/ressources/icons/SOURCE b/ressources/icons/SOURCE index db176a4..2e0b92e 100644 --- a/ressources/icons/SOURCE +++ b/ressources/icons/SOURCE @@ -1 +1,2 @@ http://www.iconarchive.com/category/application-icons.html +http://www.webidev.com/fr/WebiInscrit diff --git a/ressources/icons/import-icon.png b/ressources/icons/import-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..11ce262cbbeadbffb48058dd6c0c418f76ffd5e8 GIT binary patch literal 4894 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 Qg#Z8m07*qoM6N<$f^AGe>;M1& literal 0 HcmV?d00001 diff --git a/ressources/init.sql b/ressources/init.sql index ecba2f0..ab44767 100644 --- a/ressources/init.sql +++ b/ressources/init.sql @@ -6,4 +6,5 @@ CREATE TABLE account_amount(id INTEGER PRIMARY KEY, account REFERENCES account(i CREATE TABLE operation(id INTEGER PRIMARY KEY, parent REFERENCES operation(id), user REFERENCES user(id), account REFERENCES account(id), year INTEGER, month INTEGER, day INTEGER, amount FLOAT, description VARCHAR(255), category REFERENCES category(id), fix_cost CHAR(1), checked CHAR(1), formula VARCHAR(255), transfert REFERENCES operation(id), meta CHAR(1), virtual CHAR(1)); CREATE TABLE category(id INTEGER PRIMARY KEY, user REFERENCES user(id), parent REFERENCES category(id), name VARCHAR(255), backcolor VARCHAR(10), forecolor VARCHAR(10), font VARCHAR(255), fix_cost CHAR(1)); CREATE TABLE preference(id INTEGER PRIMARY KEY, user REFERENCES user(id), name VARCHAR(255), value VARCHAR(255)); -INSERT INTO kisscount ("db_version") VALUES ("2"); \ No newline at end of file +CREATE TABLE import_pattern(id INTEGER PRIMARY KEY, user REFERENCES user(id), description VARCHAR(255), pattern VARCHAR(255), account REFERENCES account(id), category REFERENCES category(id)); +INSERT INTO kisscount ("db_version") VALUES ("2"); diff --git a/src/controller/KissCount.cpp b/src/controller/KissCount.cpp index e62b21c..4c5772e 100644 --- a/src/controller/KissCount.cpp +++ b/src/controller/KissCount.cpp @@ -607,3 +607,8 @@ ImportEngine* KissCount::GetImportEngine(wxString path) return NULL; } + +void KissCount::UpdateImportPattern() +{ + _db->UpdateImportPattern(_user); +} diff --git a/src/controller/KissCount.h b/src/controller/KissCount.h index dd52399..e741390 100644 --- a/src/controller/KissCount.h +++ b/src/controller/KissCount.h @@ -111,6 +111,7 @@ public: wxString GetImportEngineExtensions(); ImportEngine* GetImportEngine(wxString path); + void UpdateImportPattern(); private: wxUI* _wxUI; Database* _db; diff --git a/src/model/Database.cpp b/src/model/Database.cpp index 7fe6165..735ba5f 100644 --- a/src/model/Database.cpp +++ b/src/model/Database.cpp @@ -209,6 +209,7 @@ User* Database::LoadUser(const wxString& name) User* user; Account account; Category category; + ImportPattern importPattern; std::vector::iterator it; @@ -314,6 +315,20 @@ User* Database::LoadUser(const wxString& name) set.Finalize(); + req = wxT("SELECT * FROM import_pattern WHERE user='") + user->_id + wxT("'"); + EXECUTE_SQL_QUERY_WITH_CODE(req, set, NULL, {delete user;}, {delete user;}); + + while (set.NextRow()) + { + importPattern.pattern = set.GetAsString(wxT("pattern")); + importPattern.account = set.GetAsString(wxT("account")); + importPattern.category = set.GetAsString(wxT("category")); + + user->_importPatterns[set.GetAsString(wxT("description"))] = importPattern; + } + + set.Finalize(); + return user; } @@ -1725,3 +1740,45 @@ wxString Database::getSharedAccountOwner(const wxString& account) return set2.GetAsString(wxT("name")); } + +void Database::UpdateImportPattern(User* user) +{ + std::map::iterator it; + wxString req, key; + + for (it = user->_importPatterns.begin(); + it != user->_importPatterns.end(); + it++) + { + if (it->second.pattern == NULL_IMPORT_PATTERN) continue; + + key = ImportEngine::RemoveUnused(it->first); + + req = wxT("UPDATE import_pattern SET ") ; + req += wxT("pattern='") + it->second.pattern + wxT("'"); + req += wxT(", account='") + it->second.account + wxT("'"); + req += wxT(", category='") + it->second.category + wxT("'"); + req += wxT(" WHERE description='") + key + wxT("'"); + + try + { + if (!_db.ExecuteUpdate(req)) + { + req = wxT("INSERT INTO import_pattern ('user', 'description', 'pattern', 'account', 'category') VALUES ('") ; + req += user->_id + wxT("'"); + req += wxT(" ,'") + key + wxT("'"); + req += wxT(" ,'") + it->second.pattern + wxT("'"); + req += wxT(" ,'") + it->second.account + wxT("'"); + req += wxT(" ,'") + it->second.category + wxT("'"); + req += wxT(")"); + EXECUTE_SQL_UPDATE(req, ); + } + } + catch (wxSQLite3Exception e) + { + std::cerr << req.mb_str() << "\n" ; + std::cerr << e.GetMessage().mb_str() << "\n" ; + return ; + } + } +} diff --git a/src/model/Database.h b/src/model/Database.h index cef09a3..e0732c8 100644 --- a/src/model/Database.h +++ b/src/model/Database.h @@ -164,6 +164,8 @@ public: std::map* GetNotChecked(User* user, int month, int year); std::map* GetVirtualAmount(User* user, int month, int year); + void UpdateImportPattern(User* user); + /* Database Update */ void CheckDatabaseVersion(); diff --git a/src/model/Database_Update.cpp b/src/model/Database_Update.cpp index 65d861d..dbfc113 100644 --- a/src/model/Database_Update.cpp +++ b/src/model/Database_Update.cpp @@ -64,6 +64,11 @@ static void Version_1_to_2(wxSQLite3Database& _db) req = wxT("UPDATE operation SET virtual='0'"); UPDATE_TABLE("1", "2", "7"); + + /* Import Pattern */ + req = wxT("CREATE TABLE import_pattern(id INTEGER PRIMARY KEY, user REFERENCES user(id), description VARCHAR(255), pattern VARCHAR(255), account REFERENCES account(id), category REFERENCES category(id))"); + + UPDATE_TABLE("1", "2", "8"); } static update_func updates[] = { diff --git a/src/model/User.h b/src/model/User.h index b2847f3..dbc89cc 100644 --- a/src/model/User.h +++ b/src/model/User.h @@ -73,6 +73,7 @@ public: void UnGroup(const Operation& op); void ResolveGroups(int year); + void UpdateImportPattern(User* user); private: Database* _db; }; diff --git a/src/model/import/ImportEngine.cpp b/src/model/import/ImportEngine.cpp index 134aafd..90e7b30 100644 --- a/src/model/import/ImportEngine.cpp +++ b/src/model/import/ImportEngine.cpp @@ -83,7 +83,7 @@ std::vector ExplodeString(wxString& s) - tail spaces - every word starting by a number */ -wxString ImportEngine::RemoveUnused(wxString& s) +wxString ImportEngine::RemoveUnused(const wxString& s) { wxString tmp = s, tmp2; wxString res; @@ -124,9 +124,16 @@ wxString ImportEngine::FindPattern(wxString& orig, wxString& dest) { wxString pattern, cur_pat; int i, a; - std::vector tok1 = ExplodeString(orig); - std::vector tok2 = ExplodeString(dest); - int size1 = tok1.size(), size2 = tok2.size(); + std::vector tok1; + std::vector tok2; + int size1, size2; + + if (orig == dest) return NULL_IMPORT_PATTERN; + + tok1 = ExplodeString(orig); + tok2 = ExplodeString(dest); + size1 = tok1.size(); + size2 = tok2.size(); for(i=0; i tok1 = ExplodeString(pattern.filter); - std::vector tok2 = ExplodeString(op.description); - int size1 = tok1.size(), i; + std::vector tok1; + std::vector tok2; + int size1, i; long pos; + op.account = pattern.account; + op.category = pattern.category; + + if (pattern.pattern == NULL_IMPORT_PATTERN) return; + + tok1 = ExplodeString(pattern.pattern); + tok2 = ExplodeString(op.description); + size1 = tok1.size(); + op.description = wxT(""); for(i=0; i_importPatterns.count(key1)) { - pattern.filter = FindPattern(originalKey, op.description); + pattern.pattern = FindPattern(originalKey, op.description); pattern.account = op.account; pattern.category = op.category; _user->_importPatterns[key1] = pattern; - // std::cout << "New pattern " << key1.mb_str() << "\t" << pattern.filter.mb_str() << std::endl; + // std::cout << "New pattern " << key1.mb_str() << "\t" << pattern.pattern.mb_str() << std::endl; } else { @@ -267,3 +281,26 @@ void ImportEngine::MatchPattern(wxString& originalKey, Operation& op) ApplyPattern(_user->_importPatterns[key1], op); } } + +std::vector ImportEngine::ParseFile() +{ + return _unresolvedAccounts; +} + +std::vector* ImportEngine::GetOperations(std::map& accounts) +{ + int i; + + for(i=0; i<(int)_operations.size(); i++) + { + if (_operations[i].account.StartsWith(wxT("unknown-"))) + _operations[i].account = accounts[_operations[i].account.Mid(8)]; + } + + if (_kiss->GetOperationOrder() == wxT("ASC")) + std::sort(_operations.begin(), _operations.end(), sortOperations); + else + std::sort(_operations.begin(), _operations.end(), reverseSortOperations); + + return &_operations; +} diff --git a/src/model/import/ImportEngine.h b/src/model/import/ImportEngine.h index af18bf3..efc54a1 100644 --- a/src/model/import/ImportEngine.h +++ b/src/model/import/ImportEngine.h @@ -27,11 +27,13 @@ class KissCount; class ImportPattern { public: - wxString filter; + wxString pattern; wxString account; wxString category; } ; +#define NULL_IMPORT_PATTERN wxT("(nil)") + class ImportEngine { public: ImportEngine(); @@ -42,17 +44,18 @@ public: virtual wxString GetFileExt(); // Handle the file - virtual bool HandleFile(const wxString& path, User* user, Database* db, KissCount* kiss); + virtual bool HandleFile(const wxString& path, User* user, Database* db, KissCount* kiss)=0; // Parse the file and return accounts that doesn't match - virtual std::vector ParseFile()=0; + virtual std::vector ParseFile(); // Final Step - virtual std::vector* GetOperations(std::map& accounts)=0; + virtual std::vector* GetOperations(std::map& accounts); void MatchPattern(wxString& key, Operation& op); int UpdatePattern(int pos); + static wxString RemoveUnused(const wxString& s); protected: Database* _db; User* _user; @@ -67,7 +70,6 @@ protected: std::vector _operations; std::map _descriptions; - wxString RemoveUnused(wxString& s); void ApplyPattern(ImportPattern& pattern, Operation& op); wxString FindPattern(wxString& s1, wxString& s2); }; diff --git a/src/model/import/OFXImportEngine.cpp b/src/model/import/OFXImportEngine.cpp index e6a3c30..0ad607c 100644 --- a/src/model/import/OFXImportEngine.cpp +++ b/src/model/import/OFXImportEngine.cpp @@ -43,7 +43,7 @@ int OFXImportEngine::account_cb(const struct OfxAccountData data, void * account if (!_this->_curAccount.Len()) { - _this->_accounts[account_number] = wxT("unknown-") + account_number; + _this->_curAccount = _this->_accounts[account_number] = wxT("unknown-") + account_number; _this->_unresolvedAccounts.push_back(account_number); } @@ -136,18 +136,3 @@ bool OFXImportEngine::HandleFile(const wxString& path, User* user, Database* db, return !libofx_proc_file(_ctx, path.mb_str(), AUTODETECT); } - -std::vector OFXImportEngine::ParseFile() -{ - return _unresolvedAccounts; -} - -std::vector* OFXImportEngine::GetOperations(std::map& accounts) -{ - if (_kiss->GetOperationOrder() == wxT("ASC")) - std::sort(_operations.begin(), _operations.end(), sortOperations); - else - std::sort(_operations.begin(), _operations.end(), reverseSortOperations); - - return &_operations; -} diff --git a/src/model/import/OFXImportEngine.h b/src/model/import/OFXImportEngine.h index 803505a..3c3324f 100644 --- a/src/model/import/OFXImportEngine.h +++ b/src/model/import/OFXImportEngine.h @@ -29,8 +29,8 @@ public: ~OFXImportEngine(); virtual bool HandleFile(const wxString& path, User* user, Database* db, KissCount* kiss); - virtual std::vector ParseFile(); - virtual std::vector* GetOperations(std::map& accounts); + /* virtual std::vector ParseFile(); */ + /* virtual std::vector* GetOperations(std::map& accounts); */ private: LibofxContextPtr _ctx; diff --git a/src/view/ImportPanel.cpp b/src/view/ImportPanel.cpp index 2dc8f2a..04cf600 100644 --- a/src/view/ImportPanel.cpp +++ b/src/view/ImportPanel.cpp @@ -19,11 +19,12 @@ #include "ImportPanel.h" -enum {OPEN_FILE_ID=1, BUTTON_OPEN_ID, NAME_ID, BUTTON_LOAD_ID, BUTTON_INTEGRATE_ID, OPS_GRID_ID}; +enum {OPEN_FILE_ID=1, BUTTON_OPEN_ID, NAME_ID, BUTTON_LOAD_ID, BUTTON_INTEGRATE_ID, CHECK_SAVE_ID, OPS_GRID_ID}; BEGIN_EVENT_TABLE(ImportPanel, wxPanel) EVT_GRID_CMD_CELL_CHANGE(OPS_GRID_ID, ImportPanel::OnOperationModified) EVT_BUTTON(BUTTON_OPEN_ID, ImportPanel::OnFile) +EVT_BUTTON(BUTTON_INTEGRATE_ID, ImportPanel::OnIntegrate) EVT_TEXT_ENTER(OPEN_FILE_ID, ImportPanel::OnFileEnter) EVT_BUTTON(BUTTON_LOAD_ID, ImportPanel::OnLoadOperations) EVT_SHOW(ImportPanel::OnShow) @@ -33,7 +34,7 @@ ImportPanel::ImportPanel(KissCount* kiss, wxUI *parent) : KissPanel(kiss, parent { wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL); wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL); - wxBoxSizer *hbox2 = new wxBoxSizer(wxHORIZONTAL); + _hbox = new wxBoxSizer(wxHORIZONTAL); wxButton* buttonOpen; wxRect rect = wxDisplay().GetGeometry(); int w, h; @@ -54,10 +55,13 @@ ImportPanel::ImportPanel(KissCount* kiss, wxUI *parent) : KissPanel(kiss, parent _buttonIntegrate = new wxButton(this, BUTTON_INTEGRATE_ID, wxT("Integrate operations")); _buttonIntegrate->Disable(); + _checkSaveImportPatterns = new wxCheckBox(this, CHECK_SAVE_ID, wxT("Save import patterns")); + hbox->Add(_fileTxt, 0, wxGROW|wxALL, 5); hbox->Add(buttonOpen, 0, wxALL, 5); hbox->Add(_buttonLoadOperations, 0, wxALL, 5); hbox->Add(_buttonIntegrate, 0, wxALL, 5); + hbox->Add(_checkSaveImportPatterns, 0, wxALL, 5); vbox->Add(hbox, 0); @@ -73,10 +77,10 @@ ImportPanel::ImportPanel(KissCount* kiss, wxUI *parent) : KissPanel(kiss, parent _operationsGrid = new GridAccount(kiss, this, OPS_GRID_ID, false, false, false); - hbox2->Add(staticBoxSizer, 0, wxGROW|wxALL, 15); - hbox2->Add(_operationsGrid, 0, wxGROW|wxALL, 15); + _hbox->Add(staticBoxSizer, 0, wxGROW|wxALL, 15); + _hbox->Add(_operationsGrid, 0, wxGROW|wxALL, 15); - vbox->Add(hbox2, wxGROW); + vbox->Add(_hbox, wxGROW); Fit(); @@ -93,7 +97,7 @@ KissPanel* ImportPanel::CreatePanel() wxBitmapButton* ImportPanel::GetButton(int id) { if (!_KissButton) - _KissButton = new wxBitmapButton(_wxUI, id, wxBitmap(wxT(PREFS_ICON), wxBITMAP_TYPE_PNG), wxDefaultPosition, wxSize(128, 128)); + _KissButton = new wxBitmapButton(_wxUI, id, wxBitmap(wxT(IMPORT_ICON), wxBITMAP_TYPE_PNG), wxDefaultPosition, wxSize(128, 128)); return _KissButton; } @@ -195,8 +199,9 @@ void ImportPanel::ProcessFile() void ImportPanel::OnLoadOperations(wxCommandEvent& WXUNUSED(event)) { std::map resolvedAccounts; - int i; + int i, nbAccounts; User* user = _kiss->GetUser(); + Account account; for(i=0; i<_accountsGrid->GetNumberRows(); i++) { @@ -204,13 +209,57 @@ void ImportPanel::OnLoadOperations(wxCommandEvent& WXUNUSED(event)) user->GetAccountId(_accountsGrid->GetCellValue(i, 1)); } + nbAccounts = 0; + for(i=0; i<_accountsGrid->GetNumberRows(); i++) + { + if (_accountsGrid->GetCellValue(i, 1) == _("Create one")) + nbAccounts++; + } + + if (nbAccounts) + { + wxString message = wxString::Format(wxT("%d"), nbAccounts); + message += _(" account(s) will be created, is it ok ?"); + + wxMessageDialog dialog(_wxUI, message, wxT("KissCount"), wxYES_NO); + if (dialog.ShowModal() == wxID_NO) + return; + + for(i=0; i<_accountsGrid->GetNumberRows(); i++) + { + if (_accountsGrid->GetCellValue(i, 1) == _("Create one")) + { + account.name = _accountsGrid->GetCellValue(i, 0); + account.number = _accountsGrid->GetCellValue(i, 0); + account.shared = false; + account.blocked = false; + account._default = false; + account.is_owner = true; + account._virtual = false; + + resolvedAccounts[_accountsGrid->GetCellValue(i, 0)] = _kiss->AddAccount(account); + } + } + + _accountsGrid->DeleteRows(0, _accountsGrid->GetNumberRows ()); + + _wxUI->NeedReload(); + } + _operations = _importEngine->GetOperations(resolvedAccounts); if (_operations->size()) { + _hbox->Detach(_operationsGrid); + delete _operationsGrid; + _operationsGrid = new GridAccount(_kiss, this, OPS_GRID_ID, false, false, false); + _hbox->Add(_operationsGrid, 0, wxGROW|wxALL, 15); + _operationsGrid->LoadOperations(_operations, 0, 0); _buttonIntegrate->Enable(); + _buttonLoadOperations->Disable(); + Fit(); } else @@ -219,6 +268,32 @@ void ImportPanel::OnLoadOperations(wxCommandEvent& WXUNUSED(event)) } } +void ImportPanel::OnIntegrate(wxCommandEvent& WXUNUSED(event)) +{ + int i; + + if (!_operations->size()) return; + + wxMessageDialog dialog(_wxUI, _("Are you sure want to integrate these operations ?"), wxT("KissCount"), wxYES_NO); + if (dialog.ShowModal() == wxID_NO) + return; + + _buttonIntegrate->Disable(); + + for(i=0; i<(int)_operations->size(); i++) + _kiss->AddOperation((*_operations)[i]); + + // if (_checkSaveImportPatterns->IsChecked()) + _kiss->UpdateImportPattern(); + + _operations->clear(); + _operationsGrid->ClearGrid(); + + wxMessageBox(_("Operations successfully imported"), wxT("KissCount"), wxICON_INFORMATION | wxOK); + + _wxUI->NeedReload(); +} + void ImportPanel::OnOperationModified(wxGridEvent& event) { int col = event.GetCol(); @@ -238,8 +313,6 @@ void ImportPanel::OnOperationModified(wxGridEvent& event) if (_importEngine->UpdatePattern(row-1) > 1) _operationsGrid->LoadOperations(_operations, 0, 0); - // sleep(1); - Fit(); update = false; diff --git a/src/view/ImportPanel.h b/src/view/ImportPanel.h index 545b7e2..3c30f71 100644 --- a/src/view/ImportPanel.h +++ b/src/view/ImportPanel.h @@ -48,14 +48,17 @@ public: void OnFile(wxCommandEvent& WXUNUSED(event)); void OnFileEnter(wxCommandEvent& WXUNUSED(event)); void OnLoadOperations(wxCommandEvent& WXUNUSED(event)); + void OnIntegrate(wxCommandEvent& WXUNUSED(event)); void OnOperationModified(wxGridEvent& event); private: + wxBoxSizer *_hbox; wxGrid* _accountsGrid; wxTextCtrl* _fileTxt; GridAccount* _operationsGrid; ImportEngine* _importEngine; wxButton* _buttonLoadOperations, *_buttonIntegrate; + wxCheckBox *_checkSaveImportPatterns; std::vector* _operations; void ProcessFile(); diff --git a/src/view/view.h b/src/view/view.h index 7e64524..de0c0d4 100644 --- a/src/view/view.h +++ b/src/view/view.h @@ -34,6 +34,7 @@ #define STATS_ICON RESSOURCES_ROOT "icons/chart-icon.png" #define SEARCH_ICON RESSOURCES_ROOT "icons/Search-icon.png" #define PREFS_ICON RESSOURCES_ROOT "icons/options-icon.png" +#define IMPORT_ICON RESSOURCES_ROOT "icons/import-icon.png" #define CHANGE_USER_ICON RESSOURCES_ROOT "icons/Clients-icon.png" #define ABOUT_ICON RESSOURCES_ROOT "icons/windows-users-icon.png" #define QUIT_ICON RESSOURCES_ROOT "icons/system-log-out.png"