From f4f159f7f074526016d7f2977ab55668d7dd5e09 Mon Sep 17 00:00:00 2001 From: yboucher <yann.boucher@etu.utc.fr> Date: Wed, 2 Jun 2021 15:12:32 +0200 Subject: [PATCH] Restore discarded changes regarding loading/saving alphabet data; added support for cancelling customization --- include/interface.hpp | 4 ++ src/interface.cpp | 98 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 91 insertions(+), 11 deletions(-) diff --git a/include/interface.hpp b/include/interface.hpp index c3e4d14..4b23d75 100644 --- a/include/interface.hpp +++ b/include/interface.hpp @@ -95,6 +95,8 @@ private: //! \brief Charge la grille depuis une image. void load_from_image(); + void ui_update_alphabet(const Alphabet& alph); + //! \brief Retourne le modèle par défaut à charger QJsonObject default_model() const; private: @@ -102,5 +104,7 @@ private: Simulation simulation; TransitionRule* m_transition_rule; NeighborhoodRule* m_neighborhood_rule; + QJsonObject m_loaded_model; + bool m_customizing; }; #endif // MAINWINDOW_HPP diff --git a/src/interface.cpp b/src/interface.cpp index b431f3c..6871f41 100644 --- a/src/interface.cpp +++ b/src/interface.cpp @@ -17,7 +17,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) - , simulation() + , simulation(), + m_customizing(false) { ui->setupUi(this); @@ -313,8 +314,9 @@ void MainWindow::update_neighborhood_settings() void MainWindow::enable_rule_customization() { ui->simulation_tab->setEnabled(false); - ui->customize_button->setEnabled(false); + ui->customize_button->setText("Cancel customization"); ui->rule_settings->setEnabled(true); + m_customizing = true; } void MainWindow::disable_rule_customization() @@ -322,15 +324,47 @@ void MainWindow::disable_rule_customization() ui->simulation_tab->setEnabled(true); ui->customize_button->setEnabled(true); ui->rule_settings->setEnabled(false); + ui->customize_button->setText("Customize..."); + m_customizing = false; } void MainWindow::load_model(const QJsonObject &obj) { ui->rule_name->setText(obj.value("title").toString()); - // TODO : load alphabet + ui->transition_list->setCurrentText(obj.value("transition_name").toString()); ui->neighborhood_list->setCurrentText(obj.value("neighborhood_name").toString()); + bool alpha_initialise = false; + Alphabet alpha; + if (obj.value("alphabet").isArray()) + { + for (auto entry : obj.value("alphabet").toArray()) + { + if (!entry.isObject()) + continue; + + auto entry_obj = entry.toObject(); + std::string name = entry_obj.value("name").toString().toStdString(); + + if (!entry_obj.value("color").isArray()) + continue; + + auto color_array = entry_obj.value("color").toArray(); + stateColor color(color_array[0].toInt(), color_array[1].toInt(), color_array[2].toInt()); + + // Initialisation avec le premier élement + if (!alpha_initialise) + { + alpha = Alphabet(state(color, name)); + alpha_initialise = true; + } + else + alpha.newEtat(state(color, name)); + } + } + + update_transition_settings(); update_neighborhood_settings(); disable_rule_customization(); @@ -353,10 +387,14 @@ void MainWindow::load_model(const QJsonObject &obj) prop->accept(visit); } + ui_update_alphabet(alpha); + // On transfère la propriété de ces pointeurs vers Simulation, qui en est désormais propriétaire pour l'exécution de l'automate simulation.setNeighborhoodRule(m_neighborhood_rule); simulation.setTransitionRule(m_transition_rule); - simulation.setAlphabet(ui->grid_view->alphabet()); + simulation.setAlphabet(alpha); + + m_loaded_model = obj; } void MainWindow::save_model() @@ -387,9 +425,21 @@ void MainWindow::save_model() root["neighborhood_name"] = ui->neighborhood_list->currentText(); root["neighborhood_data"] = neighborhood_saver.save(); - // TODO : sauvegarder l'alphabet quand on pourra y accéder avec Simulation QJsonArray alphabet; + for (unsigned i = 0; i < simulation.getAlphabet().taille(); ++i) + { + auto state = simulation.getAlphabet().getState(i); + QJsonArray color; + QJsonObject entry; + entry["name"] = QString::fromStdString(state.getStateLabel()); + color.push_back(state.getColor().getRed()); + color.push_back(state.getColor().getGreen()); + color.push_back(state.getColor().getBlue()); + entry["color"] = color; + alphabet.push_back(entry); + } + root["alphabet"] = alphabet; QJsonDocument doc(root); @@ -446,14 +496,32 @@ void MainWindow::load_from_image() ui->grid_view->copy_grid(grid); } +void MainWindow::ui_update_alphabet(const Alphabet &alpha) +{ + ui->grid_view->set_alphabet(alpha); + ui->nbrStateComboBox->clear(); + for (unsigned i = 0; i < alpha.taille(); ++i) + ui->nbrStateComboBox->addItem(QString::number(i)); + ui->nbrStatesComboBox->clear(); + ui->nbrStatesComboBox->addItem(QString::number(alpha.taille())); +} + QJsonObject MainWindow::default_model() const { - QJsonObject obj; - obj["title"] = "Game of Life"; - obj["transition_name"] = "Game of Life"; - obj["transition_data"] = QJsonObject(); + const char* json = R"( + { + "title" : "Game of Life", + "transition_name" : "Game of Life", + "transition_data" : {}, + "alphabet" : [ + {"name" : "Dead", "color" : [255, 255, 255]}, + {"name" : "Alive", "color" : [0, 0, 255]}] + } +)"; + + QJsonDocument doc = QJsonDocument::fromJson(QByteArray(json)); - return obj; + return doc.object(); } void MainWindow::on_saveRuleButton_clicked() @@ -463,6 +531,14 @@ void MainWindow::on_saveRuleButton_clicked() void MainWindow::on_customize_button_clicked() { - enable_rule_customization(); + if (!m_customizing) + { + enable_rule_customization(); + } + else + { + disable_rule_customization(); + load_model(m_loaded_model); + } } -- GitLab