diff --git a/Undo.h b/Undo.h new file mode 100644 index 0000000..e4ad16d --- /dev/null +++ b/Undo.h @@ -0,0 +1,21 @@ +#ifndef UNDO_H +#define UNDO_H + +#include +#include + +class LineEditCommand : public QUndoCommand { +public: + LineEditCommand(QLineEdit* edit, const QString& oldText, const QString& newText) + : m_edit(edit), m_oldText(oldText), m_newText(newText) {} + + void undo() override { m_edit->setText(m_oldText); } + void redo() override { m_edit->setText(m_newText); } + +private: + QLineEdit* m_edit; + QString m_oldText; + QString m_newText; +}; + +#endif // UNDO_H diff --git a/data/parcours2.json b/data/parcours2.json new file mode 100644 index 0000000..6ed3056 --- /dev/null +++ b/data/parcours2.json @@ -0,0 +1,80 @@ +{ + "name": "Chemin des Saveurs", + "city": "Bourg en Bresse", + "departement": 1, + "difficulty": 3, + "duration": 3.8, + "length": 24.6, + "description": "Parcours gourmand et culturel entre ville et campagne, à la découverte des trésors cachés de Bourg en Bresse.", + "image": "data/parcours1.png", + "steps": [ + { + "numero": 1, + "title": "Départ au centre-ville", + "GPS": "N 46 12.321 E 5 13.245", + "indice": "Sous la grande horloge, cherchez la plaque dorée.", + "reponse": "Horloge", + "dialogue": [ + { + "personnage": "Clémentine", + "texte": "Bienvenue à tous, voici le centre historique !" + }, + { + "personnage": "Léo", + "texte": "Regardez cette magnifique horloge, elle date du XIXe siècle !" + } + ] + }, + { + "numero": 2, + "title": "Marché couvert", + "GPS": "N 46 12.500 E 5 13.800", + "indice": "Le nombre de colonnes à l'entrée principale vous donnera la solution.", + "reponse": 6, + "dialogue": [ + { + "personnage": "Aurélie", + "texte": "Ici, on trouve les meilleurs fromages de la région !" + }, + { + "personnage": "Sami", + "texte": "Combien de colonnes vois-tu à l'entrée ?" + } + ] + }, + { + "numero": 3, + "title": "Au bord de la Reyssouze", + "GPS": "N 46 12.900 E 5 13.900", + "indice": "Sous le vieux pont de pierre, cherchez une gravure effacée.", + "reponse": "1912", + "dialogue": [ + { + "personnage": "Juliette", + "texte": "La Reyssouze apporte de la fraîcheur en été." + }, + { + "personnage": "Marc", + "texte": "Regarde cette inscription ancienne sur la pierre, tu arrives à la lire ?" + } + ] + }, + { + "numero": 4, + "title": "Arrivée à l'abbaye", + "GPS": "N 46 13.024 E 5 14.160", + "indice": "L'année inscrite au-dessus du portail principal.", + "reponse": 1655, + "dialogue": [ + { + "personnage": "Claire", + "texte": "Voilà l'abbaye ! Admire l'architecture." + }, + { + "personnage": "Nathalie", + "texte": "C'est ici la dernière étape. Observez bien la date !" + } + ] + } + ] +} diff --git a/mainwindow.cpp b/mainwindow.cpp index fa8f705..eef3d8e 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,9 +1,12 @@ #include "mainwindow.h" #include "ui_mainwindow.h" #include "path.h" - +#include "step.h" +#include "Undo.h" #include #include +#include +#include #include @@ -15,8 +18,41 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) + , undoStack(new QUndoStack(this)) + , Clipboard(QGuiApplication::clipboard()) { ui->setupUi(this); + + + connect(ui->titleEdit, &QLineEdit::editingFinished, this, [this]() { + static QString previousText; + QString currentText = ui->titleEdit->text(); + if(previousText != currentText) { + undoStack->push(new LineEditCommand(ui->titleEdit, previousText, currentText)); + previousText = currentText; + } + }); + + connect(ui->locEdit, &QLineEdit::editingFinished, this, [this]() { + static QString previousText; + QString currentText = ui->locEdit->text(); + if(previousText != currentText) { + undoStack->push(new LineEditCommand(ui->locEdit, previousText, currentText)); + previousText = currentText; + } + }); + + connect(ui->imagePath, &QLineEdit::editingFinished, this, [this]() { + static QString previousText; + QString currentText = ui->imagePath->text(); + if(previousText != currentText) { + undoStack->push(new LineEditCommand(ui->imagePath, previousText, currentText)); + previousText = currentText; + } + }); + + connect(ui->actionEditUndo, &QAction::triggered, undoStack, &QUndoStack::undo); + connect(ui->actionEditRedo, &QAction::triggered, undoStack, &QUndoStack::redo); } MainWindow::~MainWindow() @@ -44,7 +80,7 @@ void MainWindow::onTextChanged() textChanged = true; } -void MainWindow::loadPath() +void MainWindow::loadNewPath() { QString fileName = QFileDialog::getOpenFileName(this, "Open the file"); if(fileName.isEmpty()) return; @@ -58,6 +94,18 @@ void MainWindow::loadPath() Path* p = new Path(&file); currentPath = p; path.append(p); + loadPath(p); + + int pathCount = path.length(); + ui->pathNumber->setMaximum(pathCount); + ui->pathNumber->setSuffix("/" + QString::number(pathCount)); + ui->pathNumber->setValue(path.indexOf(currentPath)+1); +} + +void MainWindow::loadPath(Path* p) { + + QList steps = p->getStep(); + ui->titleEdit->setText(p->getName()); ui->locEdit->setText(p->getCity()); @@ -66,8 +114,36 @@ void MainWindow::loadPath() ui->durationSpin->setValue(p->getDuration()); ui->imagePath->setText(p->getImage()); ui->depSpin->setValue(p->getDepartement()); - loadImage(p->getImage()); + + ui->dialogEdit->clear(); + + if(!steps.isEmpty()) { + Step firstStep = p->getStep().first(); + ui->stepTitle->setText(firstStep.getTitle()); + ui->LatitudeSpin->setValue(firstStep.getLatitude()); + ui->longitudeSpin->setValue(firstStep.getLongitude()); + + for(int i = 0; i < firstStep.getTexte().length(); i++) { + QString q = firstStep.getPersonnage().at(i) + ": " + firstStep.getTexte().at(i); + ui->dialogEdit->appendPlainText(q); + } + + ui->stepNumber->setValue(1); + ui->stepNumber->setSuffix("/" + QString::number(steps.length())); + ui->stepNumber->setMaximum(steps.length()); + } +} + +void MainWindow::loadStep(Step s) { + ui->stepTitle->setText(s.getTitle()); + ui->LatitudeSpin->setValue(s.getLatitude()); + ui->longitudeSpin->setValue(s.getLongitude()); + + for(int i = 0; i < s.getTexte().length(); i++) { + QString q = s.getPersonnage().at(i) + ": " + s.getTexte().at(i); + ui->dialogEdit->appendPlainText(q); + } } void MainWindow::addNewPath() @@ -129,7 +205,7 @@ void MainWindow::on_pushButton_clicked() void MainWindow::on_actionOpen_triggered() { - this->loadPath(); + this->loadNewPath(); } void MainWindow::on_toolButton_clicked() @@ -139,6 +215,7 @@ void MainWindow::on_toolButton_clicked() loadImage(fileName); } + void MainWindow::saveFile(){ QString fileName; if (currentFile.isEmpty()) { @@ -172,10 +249,10 @@ void MainWindow::saveFile(){ stepObject["GPS"] = step.toGPSFormat(); stepObject["reponse"] = step.getResponse(); QJsonArray dialogues; - for(int i=0; isaveFile(); } +void MainWindow::on_actionopenFile_triggered() +{ + this->loadNewPath(); +} + +void MainWindow::on_actionEditCopy_triggered() +{ + QWidget *focused = QApplication::focusWidget(); + QLineEdit* lineEdit = qobject_cast(focused); + + if(lineEdit) { + Clipboard->setText(lineEdit->selectedText()); + } +} + + +void MainWindow::on_actionEditPaste_triggered() +{ + QWidget *focused = QApplication::focusWidget(); + QLineEdit* lineEdit = qobject_cast(focused); + + if(lineEdit) { + QString text = lineEdit->text(); + int pos = lineEdit->cursorPosition(); + text.insert(pos, Clipboard->text()); + lineEdit->setText(text); + } +} + + +void MainWindow::on_actionEditCut_triggered() +{ + QWidget *focused = QApplication::focusWidget(); + QLineEdit* lineEdit = qobject_cast(focused); + + if(lineEdit) { + QString text = lineEdit->text(); + QString selectedText = lineEdit->selectedText(); + int pos = lineEdit->selectionStart(); + text.remove(pos, selectedText.length()); + Clipboard->setText(selectedText); + lineEdit->setText(text); + } +} + + +void MainWindow::on_pathNumber_valueChanged(int arg1) +{ + this->loadPath(path.at(ui->pathNumber->value()-1)); +} + + +void MainWindow::on_stepNumber_valueChanged(int arg1) +{ + this->loadStep(currentPath->getStep().at(arg1-1)); +} + diff --git a/mainwindow.h b/mainwindow.h index 5540d1d..1472ed3 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -2,7 +2,8 @@ #define MAINWINDOW_H #include - +#include +#include #include "path.h" QT_BEGIN_NAMESPACE @@ -21,7 +22,9 @@ public: void updatePathView(); void updateStepView(size_t num); void onTextChanged(); - void loadPath(); + void loadNewPath(); + void loadPath(Path* p); + void loadStep(Step s); void addNewPath(); void addNewStep(); void exportHTMLMap(); @@ -36,6 +39,18 @@ private slots: void on_actionSave_triggered(); + void on_actionopenFile_triggered(); + + void on_actionEditCopy_triggered(); + + void on_actionEditPaste_triggered(); + + void on_actionEditCut_triggered(); + + void on_pathNumber_valueChanged(int arg1); + + void on_stepNumber_valueChanged(int arg1); + private: Ui::MainWindow *ui; QString currentFile; @@ -43,5 +58,7 @@ private: QList path; Path* currentPath; void loadImage(QString fileName); + QUndoStack *undoStack; + QClipboard* Clipboard; }; #endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui index 98e41b5..4aa46f1 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -7,9 +7,21 @@ 0 0 800 - 626 + 598 + + + 0 + 0 + + + + + 0 + 0 + + MainWindow @@ -51,7 +63,7 @@ QFrame::NoFrame - + 10 @@ -60,6 +72,12 @@ 27 + + 1 + + + 1 + @@ -280,10 +298,145 @@ - + + + + 0 + 0 + + QFrame::NoFrame + + + + 0 + 10 + 781 + 45 + + + + + + + 1 + + + + + + + + + + ... + + + + :/data/images/data/images/add.png:/data/images/data/images/add.png + + + + + + + + + 0 + 60 + 781 + 63 + + + + + + + + + + Latitude + + + Qt::AlignmentFlag::AlignCenter + + + + + + + 6 + + + 90.000000000000000 + + + + + + + + + + + + + Longitude + + + Qt::AlignmentFlag::AlignCenter + + + + + + + 6 + + + -180.000000000000000 + + + 180.000000000000000 + + + + + + + + + + + + + Response + + + Qt::AlignmentFlag::AlignCenter + + + + + + + + + + + + + + + 10 + 130 + 761 + 81 + + + @@ -325,7 +478,7 @@ false - + @@ -367,7 +520,7 @@ :/data/images/data/images/new.png:/data/images/data/images/new.png - NewFile + New File QAction::NoRole @@ -379,7 +532,7 @@ :/data/images/data/images/save_as.png:/data/images/data/images/save_as.png - SaveFile + Save QAction::NoRole @@ -391,7 +544,7 @@ :/data/images/data/images/save.png:/data/images/data/images/save.png - SaveAsFile + Save as QAction::NoRole @@ -403,7 +556,7 @@ :/data/images/data/images/print.png:/data/images/data/images/print.png - PrintFile + Print QAction::NoRole @@ -415,7 +568,7 @@ :/data/images/data/images/copy.png:/data/images/data/images/copy.png - EditCopy + Copy QAction::NoRole @@ -427,7 +580,7 @@ :/data/images/data/images/paste.png:/data/images/data/images/paste.png - EditPaste + Paste QAction::NoRole @@ -439,7 +592,7 @@ :/data/images/data/images/cut.png:/data/images/data/images/cut.png - EditCut + Cut QAction::NoRole @@ -451,7 +604,7 @@ :/data/images/data/images/edit_undo.png:/data/images/data/images/edit_undo.png - EditUndo + Undo QAction::NoRole @@ -463,19 +616,19 @@ :/data/images/data/images/edit_redo.png:/data/images/data/images/edit_redo.png - EditRedo + Redo QAction::NoRole - + - :/data/images/data/images/new.png:/data/images/data/images/new.png + :/data/images/data/images/open.png:/data/images/data/images/open.png - New + Open file QAction::NoRole diff --git a/sae201.pro b/sae201.pro index 8cb9d3f..04a7b14 100644 --- a/sae201.pro +++ b/sae201.pro @@ -15,6 +15,7 @@ SOURCES += \ path.cpp \ HEADERS += \ + Undo.h \ mainwindow.h \ step.h \ path.h \ diff --git a/step.cpp b/step.cpp index e812aca..93d9ec8 100644 --- a/step.cpp +++ b/step.cpp @@ -34,6 +34,16 @@ Step::Step() { } +QList Step::getPersonnage() const +{ + return personnage; +} + +QList Step::getTexte() const +{ + return texte; +} + Step::Step( QJsonObject &in) { title = in["title"].toString(); @@ -41,7 +51,7 @@ Step::Step( QJsonObject &in) QString gps = in["GPS"].toString(); QStringList parts = gps.split(" ", Qt::SkipEmptyParts); - QChar latDir = parts[0][0]; // c'est le premier QChar du QString t'as capté + QChar latDir = parts[0][0]; int latDeg = parts[1].toInt(); float latMin = parts[2].toFloat(); setLatitude(latDeg, latMin, latDir); diff --git a/step.h b/step.h index a18c15d..fc6ffd3 100644 --- a/step.h +++ b/step.h @@ -26,9 +26,9 @@ public: float getLatitude() const; float getLongitude() const; int getResponse() const; - QList getListeDialogue(); - QList getListePersonnage(); QString toGPSFormat(); + QList getPersonnage() const; + QList getTexte() const; }; #endif // STEP_H