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.
 
 
 

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