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 10 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
9 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
9 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
9 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
9 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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. #include "mainwindow.h"
  2. #include "produititem.h"
  3. #include "aboutdialog.h"
  4. #include "settingsdialog.h"
  5. #include "ui_mainwindow.h"
  6. #include "manufacturersmanager.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. #include <QJsonArray>
  27. #include <QJsonDocument>
  28. MainWindow::MainWindow(QWidget *parent) :
  29. QMainWindow(parent),
  30. ui(new Ui::MainWindow)
  31. {
  32. ui->setupUi(this);
  33. saveOnQuit = true;
  34. version = "0.7";
  35. searchBox = new QLineEdit(this);
  36. searchBox->addAction(QIcon(":/icons/icon-search.png"), QLineEdit::LeadingPosition);
  37. searchBox->setPlaceholderText(tr("Rechercher..."));
  38. searchBox->setClearButtonEnabled(true);
  39. connect(searchBox, SIGNAL(textChanged(QString)), SLOT(searchProduit(QString)));
  40. ui->mainToolBar->addSeparator();
  41. ui->mainToolBar->addWidget(searchBox);
  42. // Migration des fichiers si l'utilisateur vient d'une version antérieure à la 0.3
  43. QDir dir(QDir::homePath()+"/.deuchnord-hermes");
  44. if(dir.exists(QDir::homePath()+"/.deuchnord-hermes"))
  45. dir.rename(QDir::homePath()+"/.deuchnord-hermes", QDir::homePath()+"/deuchnord-hermes");
  46. if(QFile::exists(QDir::homePath()+"/hermes.hrms"))
  47. QFile::rename(QDir::homePath()+"/hermes.hrms", QDir::homePath()+"/deuchnord-hermes/products.hrms");
  48. // Récupération de la configuration
  49. settings = new QSettings("Deuchnord", "Hermes");
  50. QString placeSave = settings->value("placeSave").toString();
  51. if(placeSave == "")
  52. {
  53. settings->setValue("placeSave", QDir::homePath());
  54. placeSave = settings->value("placeSave").toString();
  55. }
  56. settings->setValue("lastExecutedVersion", version);
  57. QFile saveFile(placeSave + "/deuchnord-hermes/products.hrms");
  58. QDataStream content(&saveFile);
  59. content.setVersion(QDataStream::Qt_5_0);
  60. if(saveFile.open(QFile::ReadOnly))
  61. {
  62. QList<ProduitInfo> listInfoProd;
  63. content >> listInfoProd;
  64. for(ProduitInfo i : listInfoProd)
  65. ajouterProduit(new ProduitItem(this, i.nomProduit, i.dateAchat, i.dateFinGarantie, i.image, i.indexMagasin, i.enSAV, i.factures, i.garanties));
  66. }
  67. if(ui->listeProduits->count() > 0)
  68. ui->listeProduits->item(0)->setSelected(true);
  69. else
  70. ui->actionSupprimerProduit->setEnabled(false);
  71. // Recherche de nouvelle version :
  72. QNetworkAccessManager *manager = new QNetworkAccessManager(this);
  73. connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(dlVersionFinished(QNetworkReply*)));
  74. manager->get(QNetworkRequest(QUrl("https://www.deuchnord.fr/updates/hermes")));
  75. }
  76. void MainWindow::dlVersionFinished(QNetworkReply *reply)
  77. {
  78. #ifdef Q_OS_LINUX
  79. QString os = "linux";
  80. #endif
  81. #ifdef Q_OS_WIN32
  82. QString os = "windows";
  83. #endif
  84. #ifdef Q_OS_DARWIN
  85. QString os = "darwin";
  86. #endif
  87. if(reply->error() != QNetworkReply::NoError)
  88. return;
  89. QString versionsAvailable = reply->readAll();
  90. QJsonDocument versionJson = QJsonDocument::fromJson(versionsAvailable.toUtf8());
  91. QJsonObject lastVersions = versionJson.object();
  92. if(lastVersions.contains("error"))
  93. return;
  94. if(version != lastVersions[os].toString())
  95. {
  96. ui->statusBar->showMessage(tr("Une nouvelle version (%1) est disponible !", "%1 represents the number of the new version (for instance: 0.4.1)").arg(lastVersions[os].toString()));
  97. QPushButton* btnUpdate = new QPushButton(tr("Télécharger la nouvelle version"));
  98. connect(btnUpdate, SIGNAL(clicked()), this, SLOT(dlNewVersionBtnClicked()));
  99. ui->statusBar->addPermanentWidget(btnUpdate);
  100. }
  101. }
  102. void MainWindow::dlNewVersionBtnClicked()
  103. {
  104. QDesktopServices::openUrl(QUrl("https://www.deuchnord.fr/projets/hermes"));
  105. }
  106. void MainWindow::searchProduit(QString search)
  107. {
  108. if(search != "")
  109. {
  110. for(int i = 0; i < ui->listeProduits->count(); i++)
  111. {
  112. ProduitItem* item = (ProduitItem*) ui->listeProduits->itemWidget(ui->listeProduits->item(i));
  113. ProduitInfo prod = item->getProduitInfo();
  114. // On cache les produits qui ne correspondent pas
  115. if(prod.nomProduit.contains(search, Qt::CaseInsensitive))
  116. ui->listeProduits->item(i)->setHidden(false);
  117. else
  118. ui->listeProduits->item(i)->setHidden(true);
  119. }
  120. }
  121. else
  122. {
  123. // Si la zone de recherche est vide, on affiche tout
  124. for(int i = 0; i < ui->listeProduits->count(); i++)
  125. ui->listeProduits->item(i)->setHidden(false);
  126. }
  127. updateStatusMessage();
  128. }
  129. void MainWindow::on_actionNouveauProduit_triggered()
  130. {
  131. 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));
  132. prod->openDialog(true);
  133. QListWidgetItem* item = ajouterProduit(prod);
  134. item->setSelected(true);
  135. connect(prod, SIGNAL(deleteAsked()), SLOT(deleteAsked()));
  136. ui->actionSupprimerProduit->setEnabled(true);
  137. }
  138. void MainWindow::deleteAsked()
  139. {
  140. on_actionSupprimerProduit_triggered(true);
  141. }
  142. void MainWindow::on_actionSupprimerProduit_triggered(bool dontAskConfirm)
  143. {
  144. if(ui->listeProduits->selectedItems().count() == 1)
  145. {
  146. QListWidgetItem *item = ui->listeProduits->selectedItems()[0];
  147. int answer;
  148. if(!dontAskConfirm)
  149. 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);
  150. else
  151. answer = QMessageBox::Yes;
  152. if(answer == QMessageBox::Yes)
  153. {
  154. ui->listeProduits->setCurrentRow(ui->listeProduits->row(item));
  155. // Étape 1 : on vérifie si le magasin du produit est encore utilisé par d'autres produits
  156. ProduitItem *prodToRemove = ((ProduitItem*) ui->listeProduits->itemWidget(item));
  157. int manufacturer = prodToRemove->getMagasin();
  158. bool manufacturerIsUsedByAnotherProduct = false;
  159. for(int i = 0; i < ui->listeProduits->count(); i++) {
  160. if(i != ui->listeProduits->currentRow()) {
  161. QListWidgetItem *itemProd = ui->listeProduits->item(i);
  162. ProduitItem *prod = (ProduitItem*) ui->listeProduits->itemWidget(itemProd);
  163. if(prod->getMagasin() == manufacturer)
  164. manufacturerIsUsedByAnotherProduct = true;
  165. }
  166. }
  167. // Si le magasin n'est plus utilisé, on le supprime
  168. if(!manufacturerIsUsedByAnotherProduct) {
  169. ManufacturersManager mg;
  170. mg.deleteManufacturer(manufacturer);
  171. mg.save();
  172. }
  173. // Étae 2 : on suppprime le produit
  174. ui->listeProduits->removeItemWidget(item);
  175. delete item;
  176. if(ui->listeProduits->count() == 0)
  177. ui->actionSupprimerProduit->setEnabled(false);
  178. updateStatusMessage();
  179. }
  180. }
  181. }
  182. QListWidgetItem* MainWindow::ajouterProduit(ProduitItem *produit)
  183. {
  184. QListWidgetItem *widgetItem = new QListWidgetItem();
  185. widgetItem->setSizeHint(QSize(0, 128));
  186. ui->listeProduits->addItem(widgetItem);
  187. ui->listeProduits->setItemWidget(widgetItem, produit);
  188. updateStatusMessage();
  189. return widgetItem;
  190. }
  191. void MainWindow::on_actionSettings_triggered()
  192. {
  193. SettingsDialog *settingsDialog = new SettingsDialog(this);
  194. settingsDialog->setModal(true);
  195. settingsDialog->show();
  196. connect(settingsDialog, SIGNAL(dontSaveOnQuit()), SLOT(settings_dontSaveOnQuit()));
  197. }
  198. void MainWindow::settings_dontSaveOnQuit()
  199. {
  200. saveOnQuit = false;
  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://tickets.deuchnord.fr/index.php?project=2&do=index&switch=1"));
  211. }
  212. void MainWindow::on_actionAide_triggered()
  213. {
  214. QDesktopServices::openUrl(QUrl("https://doc.deuchnord.fr/hermes/start"));
  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(tr("%n produit(s) affiché(s).", "", nb));
  227. }
  228. MainWindow::~MainWindow()
  229. {
  230. // Enregistrement de la configuration
  231. if(saveOnQuit)
  232. {
  233. QString place = settings->value("placeSave").toString();
  234. QDir dir(place+"/deuchnord-hermes");
  235. if(!dir.exists())
  236. dir.mkdir(place+"/deuchnord-hermes");
  237. QDir v1Dir(place+"/deuchnord-hermes/json");
  238. if(!v1Dir.exists())
  239. dir.mkdir(place+"/deuchnord-hermes/json");
  240. // Save in JSON format for version 1.0 (one file per product to avoid huge file issue)
  241. for(int i = 0; i < ui->listeProduits->count(); i++)
  242. {
  243. ProduitItem* item = (ProduitItem*) ui->listeProduits->itemWidget(ui->listeProduits->item(i));
  244. QJsonDocument jsonDocument(item->getJSON());
  245. QFile jsonFile(place + "/deuchnord-hermes/json/" + QString::number(i) + ".json");
  246. if(jsonFile.open((QFile::WriteOnly)))
  247. {
  248. jsonFile.write(jsonDocument.toJson());
  249. jsonFile.close();
  250. }
  251. }
  252. // Legacy 0.x file
  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. }