interface.cpp 6.23 KB
Newer Older
1
2
3
#include "interface.hpp"
#include "ui_interface.h"

4
5
#include "structuresavingdialog.hpp"

6
7
#include "structurewriter.hpp"

8
9
10
11
12
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
      , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
13
14

    connect(ui->action_save_struct, &QAction::triggered, this, &MainWindow::afficher_interface_sauvegarde_structure);
15
16
17
18
19
20
21
}

MainWindow::~MainWindow()
{
    delete ui;
}

22
23
/// Connections

24
25
26
27
28
29
30
31
32
void MainWindow::on_simSpeedSpinbox_valueChanged(int arg1)
{
    ui->simSpeedSlider->setValue(arg1);
}

void MainWindow::on_simSpeedSlider_valueChanged(int value)
{
    ui->simSpeedSpinbox->setValue(value);
}
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

void MainWindow::on_openPatternButton_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),"/home",tr("PatternFile (*.pat)"));
    if(fileName == ""){
        // L'utilisateur a annulé la recherche
    }
    // Indiquer qu'un nouveau pattern vient d'être ouvert
}

void MainWindow::on_openRuleButton_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),"/home",tr("RuleFile (*.rule)"));
    if(fileName == ""){
        // L'utilisateur a annulé la recherche
    }
    // Indiquer qu'une nouvelle règle vient d'être ouverte. La règle est sauvegardé, donc on peut lancer la simulation
}

void MainWindow::on_neighborhoodComboBox_currentTextChanged(const QString &arg1)
{
    if(arg1 == "Von Neumann"){
        ui->cusumNeighborhoodButton->setEnabled(false);
        // Utiliser la règle de voisinage VonNeumann
    }
    if(arg1 == "Moore"){
        ui->cusumNeighborhoodButton->setEnabled(false);
        // Utiliser la règle de voisinage Moore
    }
    if(arg1 == "Custom"){
        ui->cusumNeighborhoodButton->setEnabled(true);
    }
}

67
void MainWindow::on_widthSpinBox_valueChanged(int)
68
69
70
71
{
    ui->validateGridDim->setEnabled(true);
}

72
void MainWindow::on_heightSpinBox_valueChanged(int)
73
74
75
76
{
    ui->validateGridDim->setEnabled(true);
}

77
78
79
void MainWindow::afficher_interface_sauvegarde_structure(bool)
{
    StructureSavingDialog dialog(this);
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
    if (!dialog.exec())
        return;

    QString filename = QFileDialog::getSaveFileName(this, "Choisir un nom de fichier", QString(), "Format Cellulut (*.json);;Format Golly RLE (*.rle)");
    QFileInfo info(filename);
    printf("%s\n", info.suffix().toStdString().c_str());
    // on pourrait utiliser un Factory ici, mais c'est possiblement overkill, les possibilités d'évolution de format de fichier sont faibles et ne justifient pas l'effort

    Structure s = ui->grid_view->selected_cells();
    s.author = dialog.auteur().toStdString();
    s.title = dialog.titre().toStdString();
    s.desc = dialog.desc().toStdString();
    s.date = dialog.date().toString().toStdString();

    std::string save_data;
    if (info.suffix() == "json")
    {
        JSONStructureWriter writer;
        save_data = writer.save_structure(s);
    }
    else if (info.suffix() == "rle")
    {
        RLEStructureWriter writer;
        save_data = writer.save_structure(s);
    }

    QFile file(filename);
    if (!file.open(QIODevice::WriteOnly))
    {
        QMessageBox::information(this, "Impossible de créer le fichier",
                                 file.errorString());
        return;
    }

    QTextStream stream(&file);
    stream << QString::fromStdString(save_data);
116
117
}

118

119
120
void MainWindow::on_validateGridDim_clicked()
{
121
122
123
    Grid oldGrid = ui->grid_view->get_grid();

    delete ui->grid_view;
124
125
126
    unsigned int nbrRow = ui->heightSpinBox->value(); // nbr de lignes => axe y
    unsigned int nbrCol = ui->widthSpinBox->value(); // nbr de colonne => axe x
    Grid newGrid(nbrRow, nbrCol);
127

128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
    unsigned oldNbrRow = oldGrid.get_rows(); // rows = nbr de lignes => axe y
    unsigned oldNbrCol = oldGrid.get_col(); // col = nbr de colonne => axe x

    if(oldNbrRow <= nbrRow && oldNbrCol <= nbrCol) {
        //std::cout << "superieur\n";
        fflush(stdout);
        for (unsigned y = 0; y < oldNbrRow ; y++) {
            for (unsigned x = 0; x < oldNbrCol ; x++) {
                Coord pos = {static_cast<int>(x), static_cast<int>(y)};
                newGrid.set_cell(pos, oldGrid.get_state(pos));
                //std::cout << "oldState : " << oldGrid.get_state(pos) << endl;
            }
        }
    }
    else
    {
144
145
        //std::cout << "superieur\n";
        fflush(stdout);
146
147
148
        for (unsigned y = 0; y < nbrRow ; y++) {
            for (unsigned x = 0; x < nbrCol ; x++) {
                Coord pos = {static_cast<int>(x), static_cast<int>(y)};
149
150
151
152
153
154
155
156
157
158
159
160
161
162
                newGrid.set_cell(pos, oldGrid.get_state(pos));
                //std::cout << "oldState : " << oldGrid.get_state(pos) << endl;
            }
        }
    }


    ui->grid_view = new GridView(ui->grid, &newGrid);
    ui->grid_view->setObjectName(QString::fromUtf8("grid_view"));
    ui->grid_view->setFrameShape(QFrame::StyledPanel);
    ui->grid_view->setFrameShadow(QFrame::Raised);
    ui->gridLayout_2->addWidget(ui->grid_view, 0, 0, 1, 1);


163
164
    ui->validateGridDim->setEnabled(false);
}
165
166
167
168
169
170
171

void MainWindow::on_nbrStateComboBox_currentTextChanged(const QString &arg1)
{
    unsigned val = arg1.toInt();

    ui->grid_view->set_current_pen(val);
}
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203

void MainWindow::on_randomPatternButton_clicked()
{
    // TODO Prendre en compte l'alphabet !
    // int nbr = rand() % nbr de states différents;

    Grid oldGrid = ui->grid_view->get_grid();
    unsigned nbrRow = oldGrid.get_rows(); // rows = nbr de lignes => axe y
    unsigned nbrCol = oldGrid.get_col(); // col = nbr de colonne => axe x
    Grid newGrid(nbrRow, nbrCol);

    for (unsigned y = 0; y < nbrRow; ++y)
    {
        for (unsigned x = 0; x < nbrCol; ++x)
        {
            // TODO Remplacer 2 par le nbr d'états différents
            // TODO comprendre pourquoi il faut inverser x et y (???)
            unsigned state = rand() % 2;
            Coord pos = {static_cast<int>(x), static_cast<int>(y)};
            std::cout << "position x= "<< pos.x << " y= "<< pos.y << endl;
            newGrid.set_cell(pos, state);
        }
    }

    delete ui->grid_view;
    ui->grid_view = new GridView(ui->grid, &newGrid);
    ui->grid_view->setObjectName(QString::fromUtf8("grid_view"));
    ui->grid_view->setFrameShape(QFrame::StyledPanel);
    ui->grid_view->setFrameShadow(QFrame::Raised);
    ui->gridLayout_2->addWidget(ui->grid_view, 0, 0, 1, 1);

}