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.
 
 
 

274 lines
7.8 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.2";
  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. // Récupération de la configuration
  40. QFile saveFile(QDir::homePath()+"/hermes.hrms");
  41. QDataStream content(&saveFile);
  42. content.setVersion(QDataStream::Qt_5_0);
  43. if(saveFile.open(QFile::ReadOnly))
  44. {
  45. QList<ProduitInfo> listInfoProd;
  46. content >> listInfoProd;
  47. for(ProduitInfo i : listInfoProd)
  48. ajouterProduit(new ProduitItem(this, i.nomProduit, i.dateAchat, i.dateFinGarantie, i.image, i.indexMagasin, i.enSAV, i.factures, i.garanties));
  49. }
  50. if(ui->listeProduits->count() > 0)
  51. ui->listeProduits->item(0)->setSelected(true);
  52. else
  53. ui->actionSupprimerProduit->setEnabled(false);
  54. // Recherche de nouvelle version :
  55. QNetworkAccessManager *manager = new QNetworkAccessManager(this);
  56. connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(dlVersionFinished(QNetworkReply*)));
  57. #ifdef Q_OS_LINUX
  58. QString os = "linux";
  59. #endif
  60. #ifdef Q_OS_WIN32
  61. QString os = "windows";
  62. #endif
  63. manager->get(QNetworkRequest(QUrl("http://hermes.deuchnord.tk/version.php?os="+os)));
  64. }
  65. void MainWindow::dlVersionFinished(QNetworkReply *reply)
  66. {
  67. QString versionAvailable = reply->readAll();
  68. if(versionAvailable != "" && version != versionAvailable)
  69. {
  70. ui->statusBar->showMessage("Une nouvelle version ("+versionAvailable+") est disponible !");
  71. QPushButton* btnUpdate = new QPushButton("Télécharger la nouvelle version");
  72. connect(btnUpdate, SIGNAL(clicked()), this, SLOT(dlNewVersionBtnClicked()));
  73. ui->statusBar->addPermanentWidget(btnUpdate);
  74. }
  75. }
  76. void MainWindow::dlNewVersionBtnClicked()
  77. {
  78. QDesktopServices::openUrl(QUrl("http://hermes.deuchnord.tk"));
  79. }
  80. void MainWindow::searchProduit(QString search)
  81. {
  82. if(search != "")
  83. {
  84. for(int i = 0; i < ui->listeProduits->count(); i++)
  85. {
  86. ProduitItem* item = (ProduitItem*) ui->listeProduits->itemWidget(ui->listeProduits->item(i));
  87. ProduitInfo prod = item->getProduitInfo();
  88. // On cache les produits qui ne correspondent pas
  89. if(prod.nomProduit.contains(search, Qt::CaseInsensitive))
  90. ui->listeProduits->item(i)->setHidden(false);
  91. else
  92. ui->listeProduits->item(i)->setHidden(true);
  93. }
  94. }
  95. else
  96. {
  97. // Si la zone de recherche est vide, on affiche tout
  98. for(int i = 0; i < ui->listeProduits->count(); i++)
  99. ui->listeProduits->item(i)->setHidden(false);
  100. }
  101. updateStatusMessage();
  102. }
  103. void MainWindow::on_actionNouveauProduit_triggered()
  104. {
  105. QFile fichierMagasins(QDir::homePath()+"/.deuchnord-hermes/manufacturers.xml");
  106. fichierMagasins.open(QFile::ReadOnly);
  107. int nbMagasins = 0;
  108. if(fichierMagasins.isOpen())
  109. {
  110. QString contenuFichier = fichierMagasins.readAll();
  111. fichierMagasins.close();
  112. QDomDocument dom;
  113. dom.setContent(contenuFichier);
  114. QDomElement root = dom.firstChildElement();
  115. QDomElement manufacturer;
  116. QDomNode node = root.firstChild();
  117. while(!node.isNull())
  118. {
  119. manufacturer = node.toElement();
  120. if(manufacturer.tagName() == "manufacturer")
  121. nbMagasins++;
  122. node = node.nextSibling();
  123. }
  124. }
  125. if(nbMagasins == 0)
  126. {
  127. QMessageBox::critical(this, "Erreur", "Aucun magasin ne semble avoir été enregistré.\nVeuillez les enregistrer avant d'entrer vos produits.");
  128. ui->actionGererMagasins->trigger();
  129. }
  130. else
  131. {
  132. ProduitItem *prod = new ProduitItem(this, "Nouveau produit", QDate::currentDate(), QDate::currentDate().addYears(1));
  133. prod->openDialog(true);
  134. QListWidgetItem* item = ajouterProduit(prod);
  135. item->setSelected(true);
  136. connect(prod, SIGNAL(deleteAsked()), SLOT(deleteAsked()));
  137. ui->actionSupprimerProduit->setEnabled(true);
  138. }
  139. }
  140. void MainWindow::deleteAsked()
  141. {
  142. on_actionSupprimerProduit_triggered(true);
  143. }
  144. void MainWindow::on_actionSupprimerProduit_triggered(bool dontAskConfirm)
  145. {
  146. if(ui->listeProduits->selectedItems().count() == 1)
  147. {
  148. QListWidgetItem *item = ui->listeProduits->selectedItems()[0];
  149. int answer;
  150. if(!dontAskConfirm)
  151. 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);
  152. else
  153. answer = QMessageBox::Yes;
  154. if(answer == QMessageBox::Yes)
  155. {
  156. ui->listeProduits->setCurrentRow(ui->listeProduits->row(item));
  157. ui->listeProduits->removeItemWidget(item);
  158. delete item;
  159. if(ui->listeProduits->count() == 0)
  160. ui->actionSupprimerProduit->setEnabled(false);
  161. updateStatusMessage();
  162. }
  163. }
  164. }
  165. void MainWindow::on_actionGererMagasins_triggered()
  166. {
  167. GestionMagasinsDialog *dialog = new GestionMagasinsDialog(this);
  168. dialog->setModal(true);
  169. dialog->show();
  170. }
  171. QListWidgetItem* MainWindow::ajouterProduit(ProduitItem *produit)
  172. {
  173. QListWidgetItem *widgetItem = new QListWidgetItem();
  174. widgetItem->setSizeHint(QSize(0, 128));
  175. ui->listeProduits->addItem(widgetItem);
  176. ui->listeProduits->setItemWidget(widgetItem, produit);
  177. updateStatusMessage();
  178. return widgetItem;
  179. }
  180. void MainWindow::on_actionAPropos_triggered()
  181. {
  182. AboutDialog *dialog = new AboutDialog(this, version);
  183. dialog->setModal(true);
  184. dialog->show();
  185. }
  186. void MainWindow::on_actionReportBug_triggered()
  187. {
  188. QDesktopServices::openUrl(QUrl("https://sourceforge.net/p/deuchnord-hermes/bugs/"));
  189. }
  190. void MainWindow::on_actionAide_triggered()
  191. {
  192. QDesktopServices::openUrl(QUrl("http://hermes.deuchnord.tk/help/"));
  193. }
  194. Ui::MainWindow *MainWindow::getUI()
  195. {
  196. return ui;
  197. }
  198. void MainWindow::updateStatusMessage()
  199. {
  200. int nb = 0;
  201. for(int i = 0; i < ui->listeProduits->count(); i++)
  202. if(!ui->listeProduits->item(i)->isHidden())
  203. nb++;
  204. ui->statusBar->showMessage(QString::number(nb)+" produit(s) affiché(s).");
  205. }
  206. MainWindow::~MainWindow()
  207. {
  208. // Enregistrement de la configuration
  209. QFile saveFile(QDir::homePath()+"/hermes.hrms");
  210. QDataStream content(&saveFile);
  211. content.setVersion(QDataStream::Qt_5_0);
  212. QList<ProduitInfo> listProd;
  213. if(saveFile.open(QFile::WriteOnly))
  214. {
  215. for(int i = 0; i < ui->listeProduits->count(); i++)
  216. {
  217. ProduitItem* item = (ProduitItem*) ui->listeProduits->itemWidget(ui->listeProduits->item(i));
  218. ProduitInfo prod = item->getProduitInfo();
  219. listProd << prod;
  220. }
  221. }
  222. content << listProd;
  223. saveFile.close();
  224. delete ui;
  225. }