interface.cpp 6.43 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
    Grid oldGrid = ui->grid_view->get_grid();

123

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
                newGrid.set_cell(pos, oldGrid.get_state(pos));
                //std::cout << "oldState : " << oldGrid.get_state(pos) << endl;
            }
        }
    }

155
    ui->grid_view->copy_grid(newGrid);
156

157
158
    ui->validateGridDim->setEnabled(false);
}
159
160
161
162
163
164
165

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

    ui->grid_view->set_current_pen(val);
}
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184

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)};
185
            //std::cout << "position x= "<< pos.x << " y= "<< pos.y << endl;
186
187
188
189
            newGrid.set_cell(pos, state);
        }
    }

190
    ui->grid_view->copy_grid(newGrid);
191
}
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215

void MainWindow::on_nbrStatesComboBox_currentTextChanged(const QString &arg1)
{
    // Nombre d'états possibles
    int val = arg1.toInt();
    // Nombre de valeurs dans le comboxBox (en partant de 0)
    int currentNbrValue = ui->nbrStateComboBox->count();
    // Si on change le nbr d'états
    if (val != currentNbrValue) {
        // Si on ajoute des états
        if (val > currentNbrValue) {
            for(int i = currentNbrValue; i < val; i++ ) {
                ui->nbrStateComboBox->addItem(QString::number(i));
            }
        }
        // Si on retire des états
        else {
            for(int i = currentNbrValue - 1; i >= val; i-- ) {
                ui->nbrStateComboBox->removeItem(i);
            }
        }
    }

}