Your warranties manager
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

mainwindow.cpp 9.7 KiB

10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. #include "mainwindow.h"
  2. #include "produititem.h"
  3. #include "gestionmagasinsdialog.h"
  4. #include "aboutdialog.h"
  5. #include "settingsdialog.h"
  6. #include "ui_mainwindow.h"
  7. #include <QSpacerItem>
  8. #include <QWidget>
  9. #include <QListWidgetItem>
  10. #include <QPixmap>
  11. #include <QSpacerItem>
  12. #include <QDate>
  13. #include <QMessageBox>
  14. #include <QListWidget>
  15. #include <QListWidgetItem>
  16. #include <QDir>
  17. #include <QFile>
  18. #include <QDataStream>
  19. #include <QList>
  20. #include <QDesktopServices>
  21. #include <QUrl>
  22. #include <QtXml/QDomDocument>
  23. #include <QNetworkAccessManager>
  24. #include <QNetworkReply>
  25. #include <QPushButton>
  26. MainWindow::MainWindow(QWidget *parent) :
  27. QMainWindow(parent),
  28. ui(new Ui::MainWindow)
  29. {
  30. ui->setupUi(this);
  31. saveOnQuit = true;
  32. version = "0.4.1";
  33. searchBox = new QLineEdit(this);
  34. searchBox->addAction(QIcon(":/icons/icon-search.png"), QLineEdit::LeadingPosition);
  35. searchBox->setPlaceholderText("Rechercher...");
  36. searchBox->setToolTip("Recherchez un produit à partir de son nom.\nLa casse n'est pas prise en compte.");
  37. searchBox->setClearButtonEnabled(true);
  38. connect(searchBox, SIGNAL(textChanged(QString)), SLOT(searchProduit(QString)));
  39. ui->mainToolBar->addSeparator();
  40. ui->mainToolBar->addWidget(searchBox);
  41. // Migration des fichiers si l'utilisateur vient d'une version antérieure à la 0.3
  42. QDir dir(QDir::homePath()+"/.deuchnord-hermes");
  43. if(dir.exists(QDir::homePath()+"/.deuchnord-hermes"))
  44. dir.rename(QDir::homePath()+"/.deuchnord-hermes", QDir::homePath()+"/deuchnord-hermes");
  45. if(QFile::exists(QDir::homePath()+"/hermes.hrms"))
  46. QFile::rename(QDir::homePath()+"/hermes.hrms", QDir::homePath()+"/deuchnord-hermes/products.hrms");
  47. // Récupération de la configuration
  48. settings = new QSettings("Deuchnord", "Hermes");
  49. QString placeSave = settings->value("placeSave").toString();
  50. if(placeSave == "")
  51. {
  52. settings->setValue("placeSave", QDir::homePath());
  53. placeSave = settings->value("placeSave").toString();
  54. }
  55. QFile saveFile(placeSave + "/deuchnord-hermes/products.hrms");
  56. QDataStream content(&saveFile);
  57. content.setVersion(QDataStream::Qt_5_0);
  58. if(saveFile.open(QFile::ReadOnly))
  59. {
  60. QList<ProduitInfo> listInfoProd;
  61. content >> listInfoProd;
  62. for(ProduitInfo i : listInfoProd)
  63. ajouterProduit(new ProduitItem(this, i.nomProduit, i.dateAchat, i.dateFinGarantie, i.image, i.indexMagasin, i.enSAV, i.factures, i.garanties));
  64. }
  65. if(ui->listeProduits->count() > 0)
  66. ui->listeProduits->item(0)->setSelected(true);
  67. else
  68. ui->actionSupprimerProduit->setEnabled(false);
  69. // Recherche de nouvelle version :
  70. QNetworkAccessManager *manager = new QNetworkAccessManager(this);
  71. connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(dlVersionFinished(QNetworkReply*)));
  72. #ifdef Q_OS_LINUX
  73. QString os = "linux";
  74. #endif
  75. #ifdef Q_OS_WIN32
  76. QString os = "windows";
  77. #endif
  78. manager->get(QNetworkRequest(QUrl("http://hermes.deuchnord.tk/version.php?os="+os)));
  79. }
  80. void MainWindow::dlVersionFinished(QNetworkReply *reply)
  81. {
  82. QString versionAvailable = reply->readAll();
  83. if(versionAvailable != "" && version != versionAvailable)
  84. {
  85. ui->statusBar->showMessage("Une nouvelle version ("+versionAvailable+") est disponible !");
  86. QPushButton* btnUpdate = new QPushButton("Télécharger la nouvelle version");
  87. connect(btnUpdate, SIGNAL(clicked()), this, SLOT(dlNewVersionBtnClicked()));
  88. ui->statusBar->addPermanentWidget(btnUpdate);
  89. }
  90. }
  91. void MainWindow::dlNewVersionBtnClicked()
  92. {
  93. QDesktopServices::openUrl(QUrl("http://hermes.deuchnord.tk"));
  94. }
  95. void MainWindow::searchProduit(QString search)
  96. {
  97. if(search != "")
  98. {
  99. for(int i = 0; i < ui->listeProduits->count(); i++)
  100. {
  101. ProduitItem* item = (ProduitItem*) ui->listeProduits->itemWidget(ui->listeProduits->item(i));
  102. ProduitInfo prod = item->getProduitInfo();
  103. // On cache les produits qui ne correspondent pas
  104. if(prod.nomProduit.contains(search, Qt::CaseInsensitive))
  105. ui->listeProduits->item(i)->setHidden(false);
  106. else
  107. ui->listeProduits->item(i)->setHidden(true);
  108. }
  109. }
  110. else
  111. {
  112. // Si la zone de recherche est vide, on affiche tout
  113. for(int i = 0; i < ui->listeProduits->count(); i++)
  114. ui->listeProduits->item(i)->setHidden(false);
  115. }
  116. updateStatusMessage();
  117. }
  118. void MainWindow::on_actionNouveauProduit_triggered()
  119. {
  120. QFile fichierMagasins(settings->value("placeSave").toString()+"/deuchnord-hermes/manufacturers.xml");
  121. fichierMagasins.open(QFile::ReadOnly);
  122. int nbMagasins = 0;
  123. if(fichierMagasins.isOpen())
  124. {
  125. QString contenuFichier = fichierMagasins.readAll();
  126. fichierMagasins.close();
  127. QDomDocument dom;
  128. dom.setContent(contenuFichier);
  129. QDomElement root = dom.firstChildElement();
  130. QDomElement manufacturer;
  131. QDomNode node = root.firstChild();
  132. while(!node.isNull())
  133. {
  134. manufacturer = node.toElement();
  135. if(manufacturer.tagName() == "manufacturer")
  136. nbMagasins++;
  137. node = node.nextSibling();
  138. }
  139. }
  140. if(nbMagasins == 0)
  141. {
  142. QMessageBox::critical(this, "Erreur", "Aucun magasin ne semble avoir été enregistré.\nVeuillez les enregistrer avant d'entrer vos produits.");
  143. ui->actionGererMagasins->trigger();
  144. }
  145. else
  146. {
  147. ProduitItem *prod = new ProduitItem(this, "Nouveau produit", QDate::currentDate(), QDate::currentDate().addYears(1));
  148. prod->openDialog(true);
  149. QListWidgetItem* item = ajouterProduit(prod);
  150. item->setSelected(true);
  151. connect(prod, SIGNAL(deleteAsked()), SLOT(deleteAsked()));
  152. ui->actionSupprimerProduit->setEnabled(true);
  153. }
  154. }
  155. void MainWindow::deleteAsked()
  156. {
  157. on_actionSupprimerProduit_triggered(true);
  158. }
  159. void MainWindow::on_actionSupprimerProduit_triggered(bool dontAskConfirm)
  160. {
  161. if(ui->listeProduits->selectedItems().count() == 1)
  162. {
  163. QListWidgetItem *item = ui->listeProduits->selectedItems()[0];
  164. int answer;
  165. if(!dontAskConfirm)
  166. answer = QMessageBox::question(this, "Supprimer le produit", "Êtes-vous sûr de vouloir supprimer ce produit ?\nCette action n'est pas réversible.", QMessageBox::Yes | QMessageBox::No);
  167. else
  168. answer = QMessageBox::Yes;
  169. if(answer == QMessageBox::Yes)
  170. {
  171. ui->listeProduits->setCurrentRow(ui->listeProduits->row(item));
  172. ui->listeProduits->removeItemWidget(item);
  173. delete item;
  174. if(ui->listeProduits->count() == 0)
  175. ui->actionSupprimerProduit->setEnabled(false);
  176. updateStatusMessage();
  177. }
  178. }
  179. }
  180. void MainWindow::on_actionGererMagasins_triggered()
  181. {
  182. GestionMagasinsDialog *dialog = new GestionMagasinsDialog(this);
  183. dialog->setModal(true);
  184. dialog->show();
  185. connect(dialog, SIGNAL(magasinDeleted(int)), SLOT(magasinDeleted(int)));
  186. }
  187. void MainWindow::magasinDeleted(int indexMagasin)
  188. {
  189. // Si un magasin a été supprimé, on change le magasin pour une valeur vide.
  190. for(int i = 0; i < ui->listeProduits->count(); i++)
  191. {
  192. ProduitItem* item = (ProduitItem*) ui->listeProduits->itemWidget(ui->listeProduits->item(i));
  193. if(item->getMagasin() == indexMagasin)
  194. item->setMagasin(-1);
  195. if(item->getMagasin() > indexMagasin)
  196. item->setMagasin(item->getMagasin()-1);
  197. }
  198. }
  199. QListWidgetItem* MainWindow::ajouterProduit(ProduitItem *produit)
  200. {
  201. QListWidgetItem *widgetItem = new QListWidgetItem();
  202. widgetItem->setSizeHint(QSize(0, 128));
  203. ui->listeProduits->addItem(widgetItem);
  204. ui->listeProduits->setItemWidget(widgetItem, produit);
  205. updateStatusMessage();
  206. return widgetItem;
  207. }
  208. void MainWindow::on_actionSettings_triggered()
  209. {
  210. SettingsDialog *settingsDialog = new SettingsDialog(this);
  211. settingsDialog->setModal(true);
  212. settingsDialog->show();
  213. connect(settingsDialog, SIGNAL(dontSaveOnQuit()), SLOT(settings_dontSaveOnQuit()));
  214. }
  215. void MainWindow::settings_dontSaveOnQuit()
  216. {
  217. saveOnQuit = false;
  218. }
  219. void MainWindow::on_actionAPropos_triggered()
  220. {
  221. AboutDialog *dialog = new AboutDialog(this, version);
  222. dialog->setModal(true);
  223. dialog->show();
  224. }
  225. void MainWindow::on_actionReportBug_triggered()
  226. {
  227. QDesktopServices::openUrl(QUrl("https://sourceforge.net/p/deuchnord-hermes/bugs/"));
  228. }
  229. void MainWindow::on_actionAide_triggered()
  230. {
  231. QDesktopServices::openUrl(QUrl("http://hermes.deuchnord.tk/help/"));
  232. }
  233. Ui::MainWindow *MainWindow::getUI()
  234. {
  235. return ui;
  236. }
  237. void MainWindow::updateStatusMessage()
  238. {
  239. int nb = 0;
  240. for(int i = 0; i < ui->listeProduits->count(); i++)
  241. if(!ui->listeProduits->item(i)->isHidden())
  242. nb++;
  243. ui->statusBar->showMessage(QString::number(nb)+" produit(s) affiché(s).");
  244. }
  245. MainWindow::~MainWindow()
  246. {
  247. // Enregistrement de la configuration
  248. if(saveOnQuit)
  249. {
  250. QString place = settings->value("placeSave").toString();
  251. QDir dir(place+"/deuchnord-hermes");
  252. if(!dir.exists())
  253. dir.mkdir(place+"/deuchnord-hermes");
  254. QFile saveFile(place+"/deuchnord-hermes/products.hrms");
  255. QDataStream content(&saveFile);
  256. content.setVersion(QDataStream::Qt_5_0);
  257. QList<ProduitInfo> listProd;
  258. if(saveFile.open(QFile::WriteOnly))
  259. {
  260. for(int i = 0; i < ui->listeProduits->count(); i++)
  261. {
  262. ProduitItem* item = (ProduitItem*) ui->listeProduits->itemWidget(ui->listeProduits->item(i));
  263. ProduitInfo prod = item->getProduitInfo();
  264. listProd << prod;
  265. }
  266. }
  267. content << listProd;
  268. saveFile.close();
  269. }
  270. delete ui;
  271. }