#include "mainwindow.h" #include "produititem.h" #include "aboutdialog.h" #include "settingsdialog.h" #include "ui_mainwindow.h" #include "manufacturersmanager.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); saveOnQuit = true; version = "0.7"; searchBox = new QLineEdit(this); searchBox->addAction(QIcon(":/icons/icon-search.png"), QLineEdit::LeadingPosition); searchBox->setPlaceholderText(tr("Rechercher...")); searchBox->setClearButtonEnabled(true); connect(searchBox, SIGNAL(textChanged(QString)), SLOT(searchProduit(QString))); ui->mainToolBar->addSeparator(); ui->mainToolBar->addWidget(searchBox); // Migration des fichiers si l'utilisateur vient d'une version antérieure à la 0.3 QDir dir(QDir::homePath()+"/.deuchnord-hermes"); if(dir.exists(QDir::homePath()+"/.deuchnord-hermes")) dir.rename(QDir::homePath()+"/.deuchnord-hermes", QDir::homePath()+"/deuchnord-hermes"); if(QFile::exists(QDir::homePath()+"/hermes.hrms")) QFile::rename(QDir::homePath()+"/hermes.hrms", QDir::homePath()+"/deuchnord-hermes/products.hrms"); // Récupération de la configuration settings = new QSettings("Deuchnord", "Hermes"); QString placeSave = settings->value("placeSave").toString(); if(placeSave == "") { settings->setValue("placeSave", QDir::homePath()); placeSave = settings->value("placeSave").toString(); } settings->setValue("lastExecutedVersion", version); QFile saveFile(placeSave + "/deuchnord-hermes/products.hrms"); QDataStream content(&saveFile); content.setVersion(QDataStream::Qt_5_0); if(saveFile.open(QFile::ReadOnly)) { QList listInfoProd; content >> listInfoProd; for(ProduitInfo i : listInfoProd) ajouterProduit(new ProduitItem(this, i.nomProduit, i.dateAchat, i.dateFinGarantie, i.image, i.indexMagasin, i.enSAV, i.factures, i.garanties)); } if(ui->listeProduits->count() > 0) ui->listeProduits->item(0)->setSelected(true); else ui->actionSupprimerProduit->setEnabled(false); // Recherche de nouvelle version : QNetworkAccessManager *manager = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(dlVersionFinished(QNetworkReply*))); manager->get(QNetworkRequest(QUrl("https://www.deuchnord.fr/updates/hermes"))); } void MainWindow::dlVersionFinished(QNetworkReply *reply) { #ifdef Q_OS_LINUX QString os = "linux"; #endif #ifdef Q_OS_WIN32 QString os = "windows"; #endif #ifdef Q_OS_DARWIN QString os = "darwin"; #endif if(reply->error() != QNetworkReply::NoError) return; QString versionsAvailable = reply->readAll(); QJsonDocument versionJson = QJsonDocument::fromJson(versionsAvailable.toUtf8()); QJsonObject lastVersions = versionJson.object(); if(lastVersions.contains("error")) return; if(version != lastVersions[os].toString()) { 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())); QPushButton* btnUpdate = new QPushButton(tr("Télécharger la nouvelle version")); connect(btnUpdate, SIGNAL(clicked()), this, SLOT(dlNewVersionBtnClicked())); ui->statusBar->addPermanentWidget(btnUpdate); } } void MainWindow::dlNewVersionBtnClicked() { QDesktopServices::openUrl(QUrl("https://www.deuchnord.fr/projets/hermes")); } void MainWindow::searchProduit(QString search) { if(search != "") { for(int i = 0; i < ui->listeProduits->count(); i++) { ProduitItem* item = (ProduitItem*) ui->listeProduits->itemWidget(ui->listeProduits->item(i)); ProduitInfo prod = item->getProduitInfo(); // On cache les produits qui ne correspondent pas if(prod.nomProduit.contains(search, Qt::CaseInsensitive)) ui->listeProduits->item(i)->setHidden(false); else ui->listeProduits->item(i)->setHidden(true); } } else { // Si la zone de recherche est vide, on affiche tout for(int i = 0; i < ui->listeProduits->count(); i++) ui->listeProduits->item(i)->setHidden(false); } updateStatusMessage(); } void MainWindow::on_actionNouveauProduit_triggered() { 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)); prod->openDialog(true); QListWidgetItem* item = ajouterProduit(prod); item->setSelected(true); connect(prod, SIGNAL(deleteAsked()), SLOT(deleteAsked())); ui->actionSupprimerProduit->setEnabled(true); } void MainWindow::deleteAsked() { on_actionSupprimerProduit_triggered(true); } void MainWindow::on_actionSupprimerProduit_triggered(bool dontAskConfirm) { if(ui->listeProduits->selectedItems().count() == 1) { QListWidgetItem *item = ui->listeProduits->selectedItems()[0]; int answer; if(!dontAskConfirm) 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); else answer = QMessageBox::Yes; if(answer == QMessageBox::Yes) { ui->listeProduits->setCurrentRow(ui->listeProduits->row(item)); // Étape 1 : on vérifie si le magasin du produit est encore utilisé par d'autres produits ProduitItem *prodToRemove = ((ProduitItem*) ui->listeProduits->itemWidget(item)); int manufacturer = prodToRemove->getMagasin(); bool manufacturerIsUsedByAnotherProduct = false; for(int i = 0; i < ui->listeProduits->count(); i++) { if(i != ui->listeProduits->currentRow()) { QListWidgetItem *itemProd = ui->listeProduits->item(i); ProduitItem *prod = (ProduitItem*) ui->listeProduits->itemWidget(itemProd); if(prod->getMagasin() == manufacturer) manufacturerIsUsedByAnotherProduct = true; } } // Si le magasin n'est plus utilisé, on le supprime if(!manufacturerIsUsedByAnotherProduct) { ManufacturersManager mg; mg.deleteManufacturer(manufacturer); mg.save(); } // Étae 2 : on suppprime le produit ui->listeProduits->removeItemWidget(item); delete item; if(ui->listeProduits->count() == 0) ui->actionSupprimerProduit->setEnabled(false); updateStatusMessage(); } } } QListWidgetItem* MainWindow::ajouterProduit(ProduitItem *produit) { QListWidgetItem *widgetItem = new QListWidgetItem(); widgetItem->setSizeHint(QSize(0, 128)); ui->listeProduits->addItem(widgetItem); ui->listeProduits->setItemWidget(widgetItem, produit); updateStatusMessage(); return widgetItem; } void MainWindow::on_actionSettings_triggered() { SettingsDialog *settingsDialog = new SettingsDialog(this); settingsDialog->setModal(true); settingsDialog->show(); connect(settingsDialog, SIGNAL(dontSaveOnQuit()), SLOT(settings_dontSaveOnQuit())); } void MainWindow::settings_dontSaveOnQuit() { saveOnQuit = false; } void MainWindow::on_actionAPropos_triggered() { AboutDialog *dialog = new AboutDialog(this, version); dialog->setModal(true); dialog->show(); } void MainWindow::on_actionReportBug_triggered() { QDesktopServices::openUrl(QUrl("https://tickets.deuchnord.fr/index.php?project=2&do=index&switch=1")); } void MainWindow::on_actionAide_triggered() { QDesktopServices::openUrl(QUrl("https://doc.deuchnord.fr/hermes/start")); } Ui::MainWindow *MainWindow::getUI() { return ui; } void MainWindow::updateStatusMessage() { int nb = 0; for(int i = 0; i < ui->listeProduits->count(); i++) if(!ui->listeProduits->item(i)->isHidden()) nb++; ui->statusBar->showMessage(tr("%n produit(s) affiché(s).", "", nb)); } MainWindow::~MainWindow() { // Enregistrement de la configuration if(saveOnQuit) { QString place = settings->value("placeSave").toString(); QDir dir(place+"/deuchnord-hermes"); if(!dir.exists()) dir.mkdir(place+"/deuchnord-hermes"); QDir v1Dir(place+"/deuchnord-hermes/json"); if(!v1Dir.exists()) dir.mkdir(place+"/deuchnord-hermes/json"); // Save in JSON format for version 1.0 (one file per product to avoid huge file issue) for(int i = 0; i < ui->listeProduits->count(); i++) { ProduitItem* item = (ProduitItem*) ui->listeProduits->itemWidget(ui->listeProduits->item(i)); QJsonDocument jsonDocument(item->getJSON()); QFile jsonFile(place + "/deuchnord-hermes/json/" + QString::number(i) + ".json"); if(jsonFile.open((QFile::WriteOnly))) { jsonFile.write(jsonDocument.toJson()); jsonFile.close(); } } // Legacy 0.x file QFile saveFile(place+"/deuchnord-hermes/products.hrms"); QDataStream content(&saveFile); content.setVersion(QDataStream::Qt_5_0); QList listProd; if(saveFile.open(QFile::WriteOnly)) { for(int i = 0; i < ui->listeProduits->count(); i++) { ProduitItem* item = (ProduitItem*) ui->listeProduits->itemWidget(ui->listeProduits->item(i)); ProduitInfo prod = item->getProduitInfo(); listProd << prod; } } content << listProd; saveFile.close(); } delete ui; }