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.
 
 
 

299 lines
9.0 KiB

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