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.

пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  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.6";
  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. 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));
  120. prod->openDialog(true);
  121. QListWidgetItem* item = ajouterProduit(prod);
  122. item->setSelected(true);
  123. connect(prod, SIGNAL(deleteAsked()), SLOT(deleteAsked()));
  124. ui->actionSupprimerProduit->setEnabled(true);
  125. }
  126. void MainWindow::deleteAsked()
  127. {
  128. on_actionSupprimerProduit_triggered(true);
  129. }
  130. void MainWindow::on_actionSupprimerProduit_triggered(bool dontAskConfirm)
  131. {
  132. if(ui->listeProduits->selectedItems().count() == 1)
  133. {
  134. QListWidgetItem *item = ui->listeProduits->selectedItems()[0];
  135. int answer;
  136. if(!dontAskConfirm)
  137. 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);
  138. else
  139. answer = QMessageBox::Yes;
  140. if(answer == QMessageBox::Yes)
  141. {
  142. ui->listeProduits->setCurrentRow(ui->listeProduits->row(item));
  143. // Étape 1 : on vérifie si le magasin du produit est encore utilisé par d'autres produits
  144. ProduitItem prodToRemove = ((ProduitItem) ui->listeProduits->itemWidget(item));
  145. int manufacturer = prodToRemove.getMagasin();
  146. bool manufacturerIsUsedByAnotherProduct = false;
  147. for(int i = 0; i < ui->listeProduits->count(); i++) {
  148. if(i != ui->listeProduits->currentRow()) {
  149. QListWidgetItem *itemProd = ui->listeProduits->item(i);
  150. ProduitItem prod = (ProduitItem) ui->listeProduits->itemWidget(itemProd);
  151. if(prod.getMagasin() == manufacturer)
  152. manufacturerIsUsedByAnotherProduct = true;
  153. }
  154. }
  155. // Si le magasin n'est plus utilisé, on le supprime
  156. // TODO écrire le code correspondant
  157. // Étae 2 : on suppprime le produit
  158. ui->listeProduits->removeItemWidget(item);
  159. delete item;
  160. if(ui->listeProduits->count() == 0)
  161. ui->actionSupprimerProduit->setEnabled(false);
  162. updateStatusMessage();
  163. }
  164. }
  165. }
  166. void MainWindow::on_actionGererMagasins_triggered()
  167. {
  168. GestionMagasinsDialog *dialog = new GestionMagasinsDialog(this);
  169. dialog->setModal(true);
  170. dialog->show();
  171. connect(dialog, SIGNAL(magasinDeleted(int)), SLOT(magasinDeleted(int)));
  172. }
  173. void MainWindow::magasinDeleted(int indexMagasin)
  174. {
  175. // Si un magasin a été supprimé, on change le magasin pour une valeur vide.
  176. for(int i = 0; i < ui->listeProduits->count(); i++)
  177. {
  178. ProduitItem* item = (ProduitItem*) ui->listeProduits->itemWidget(ui->listeProduits->item(i));
  179. if(item->getMagasin() == indexMagasin)
  180. item->setMagasin(-1);
  181. if(item->getMagasin() > indexMagasin)
  182. item->setMagasin(item->getMagasin()-1);
  183. }
  184. }
  185. QListWidgetItem* MainWindow::ajouterProduit(ProduitItem *produit)
  186. {
  187. QListWidgetItem *widgetItem = new QListWidgetItem();
  188. widgetItem->setSizeHint(QSize(0, 128));
  189. ui->listeProduits->addItem(widgetItem);
  190. ui->listeProduits->setItemWidget(widgetItem, produit);
  191. updateStatusMessage();
  192. return widgetItem;
  193. }
  194. void MainWindow::on_actionSettings_triggered()
  195. {
  196. SettingsDialog *settingsDialog = new SettingsDialog(this);
  197. settingsDialog->setModal(true);
  198. settingsDialog->show();
  199. connect(settingsDialog, SIGNAL(dontSaveOnQuit()), SLOT(settings_dontSaveOnQuit()));
  200. }
  201. void MainWindow::settings_dontSaveOnQuit()
  202. {
  203. saveOnQuit = false;
  204. }
  205. void MainWindow::on_actionAPropos_triggered()
  206. {
  207. AboutDialog *dialog = new AboutDialog(this, version);
  208. dialog->setModal(true);
  209. dialog->show();
  210. }
  211. void MainWindow::on_actionReportBug_triggered()
  212. {
  213. QDesktopServices::openUrl(QUrl("https://sourceforge.net/p/deuchnord-hermes/bugs/"));
  214. }
  215. void MainWindow::on_actionAide_triggered()
  216. {
  217. QDesktopServices::openUrl(QUrl("http://hermes.deuchnord.tk/help/"));
  218. }
  219. Ui::MainWindow *MainWindow::getUI()
  220. {
  221. return ui;
  222. }
  223. void MainWindow::updateStatusMessage()
  224. {
  225. int nb = 0;
  226. for(int i = 0; i < ui->listeProduits->count(); i++)
  227. if(!ui->listeProduits->item(i)->isHidden())
  228. nb++;
  229. ui->statusBar->showMessage(tr("%n produit(s) affiché(s).", "", nb));
  230. }
  231. MainWindow::~MainWindow()
  232. {
  233. // Enregistrement de la configuration
  234. if(saveOnQuit)
  235. {
  236. QString place = settings->value("placeSave").toString();
  237. QDir dir(place+"/deuchnord-hermes");
  238. if(!dir.exists())
  239. dir.mkdir(place+"/deuchnord-hermes");
  240. QFile saveFile(place+"/deuchnord-hermes/products.hrms");
  241. QDataStream content(&saveFile);
  242. content.setVersion(QDataStream::Qt_5_0);
  243. QList<ProduitInfo> listProd;
  244. if(saveFile.open(QFile::WriteOnly))
  245. {
  246. for(int i = 0; i < ui->listeProduits->count(); i++)
  247. {
  248. ProduitItem* item = (ProduitItem*) ui->listeProduits->itemWidget(ui->listeProduits->item(i));
  249. ProduitInfo prod = item->getProduitInfo();
  250. listProd << prod;
  251. }
  252. }
  253. content << listProd;
  254. saveFile.close();
  255. }
  256. delete ui;
  257. }