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.
 
 
 

328 lines
9.7 KiB

  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";
  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(QDir::homePath()+"/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. }