Commit a4edf363 authored by Yann Boucher's avatar Yann Boucher
Browse files

Modification de GridView pour qu'elle puisse se servir des données d'un Alphabet

parent 93002d8c
Pipeline #77950 passed with stages
in 17 seconds
......@@ -15,6 +15,7 @@ Représente l'ensemble des états et de leurs informations (couleur, label) d'un
#include "stateColor.hpp"
#include <exception>
#include <vector>
class AlphabetException : public std::exception
{
......@@ -32,22 +33,21 @@ private:
class Alphabet {
//! Pointe sur un tableau de pointeurs de states
state** etats;
//! Nombre d'états réels dans l'alphabet
unsigned int nbEtats;
//! Nombre d'états désirés par l'utilisateur
unsigned int nbMaxEtats;
//! Tableau des états
std::vector<state> etats;
public:
//! Constructeur de l'Alphabet
Alphabet():etats(nullptr),nbEtats(0),nbMaxEtats(0){}
~Alphabet();
//! Un alphabet possède toujours au minimum un état nul, indiqué par null_state
//! \param null_state L'état nul
Alphabet(const state& null_state = state{stateColor{255, 255, 255}}){
newEtat(null_state); // Un alphabet possède toujours un état nul
}
public:
//! Renvoie l'alphabet
static Alphabet& getAlphabet() {static Alphabet a; return a;}
//! Renvoie le nombre d'états de l'alphabet
unsigned taille() const { return nbEtats; }
unsigned taille() const { return etats.size(); }
//! Crée un nouvel état
void newEtat(const state& s);
//! Renvoie l'état en fonction de son identifiant
......
......@@ -22,6 +22,7 @@ Cette classe représente le widget utilisé pour l'affichage et l'interaction av
#include "coord.hpp"
#include "structure.hpp"
#include "alphabet.hpp"
#include "grid.h"
......@@ -33,6 +34,8 @@ public:
GridView(QWidget *parent = nullptr);
public:
void set_alphabet(const Alphabet& alph);
void copy_grid(const Grid& grid);
Grid get_grid() const;
......@@ -58,6 +61,7 @@ private:
unsigned m_width;
unsigned m_height;
Structure m_copy_paste_buffer;
Alphabet m_alph;
};
......
......@@ -26,11 +26,11 @@ public:
{redColor = r; greenColor = g; blueColor = b;}
//! Accesseur en lecture de la couleur Rouge
char getRed() const{ return redColor; }
unsigned char getRed() const{ return redColor; }
//! Accesseur en lecture de la couleur Verte
char getGreen() const{ return greenColor; }
unsigned char getGreen() const{ return greenColor; }
//! Accesseur en lecture de la couleur Bleue
char getBlue() const{ return blueColor; }
unsigned char getBlue() const{ return blueColor; }
};
#endif // STATECOLOR_H
......@@ -10,43 +10,23 @@
#include "state.hpp"
#include "stateColor.hpp"
Alphabet::~Alphabet(){ // Définition du destructeur de la classe Alphabet : On supprime tous les états
if (etats)
{
for(unsigned int i=0 ; i<nbEtats ; i++){
delete etats[i];
}
delete[] etats;
}
}
void Alphabet::newEtat(const state& s){ // Définition de la méthode de création d'état
if(nbEtats==nbMaxEtats){ // Si l'Alphabet est "plein"
state** newtab = new state*[nbMaxEtats+1]; // On alloue dynamiquement un nouveau tableau
for(unsigned int i=0 ; i<nbEtats ; i++){
newtab[i]=etats[i]; // On affecte les états de etats vers le nouveau tableau
}
nbMaxEtats=nbMaxEtats+1;
state** old=etats;
etats=newtab; // Notre etats devient le nouveau tableau
delete[] old; // On supprime l'ancien
}
etats[nbEtats++]=new state(s.getColor(), s.getStateLabel()); // On affecte à notre nbEtats+1 emplacement l'état défini par son identifiant, couleur et nom
etats.push_back(s);
}
state Alphabet::getState(unsigned int it){ // Définition de la méthode de récupération d'un état en fonction de son identifiant
if (it < nbEtats)
if (it < etats.size())
{
return *etats[it];
return etats[it];
}
else
throw AlphabetException("ID d'état invalide");
}
void Alphabet::setState(unsigned int it, const state &s){ // Méthode permettant de modifier un identifiant d'un état. On se doit de vérifier si l'identifiant que veut donner n'a pas déjà été attribué
if (it < nbEtats)
if (it < etats.size())
{
*etats[it] = s;
etats[it] = s;
}
else
throw AlphabetException("ID d'état invalide");
......
......@@ -79,6 +79,11 @@ private:
QString m_state_name;
};
static QColor stateColor_to_QColor(const stateColor& sc)
{
return QColor::fromRgb(sc.getRed(), sc.getGreen(), sc.getBlue());
}
GridView::GridView(QWidget *parent)
: QFrame(parent), m_width(0), m_height(0)
{
......@@ -87,7 +92,6 @@ GridView::GridView(QWidget *parent)
setFrameStyle(Sunken | StyledPanel);
m_scene = new QGraphicsScene(this);
//m_scene->setBackgroundBrush(Qt::black);
m_view = new QGraphicsView(this);
m_view->setRenderHint(QPainter::Antialiasing, false);
......@@ -95,8 +99,6 @@ GridView::GridView(QWidget *parent)
m_view->setOptimizationFlags(QGraphicsView::DontSavePainterState);
m_view->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
m_view->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
// m_view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// m_view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_view->setScene(m_scene);
m_view->viewport()->setCursor(Qt::ArrowCursor);
......@@ -110,41 +112,51 @@ GridView::GridView(QWidget *parent)
m_width = m_height = 100;
// Test Alphabet
Alphabet alph(state{stateColor{255, 255, 255}, "Dead"});
alph.newEtat(state{stateColor{0, 0, 255}, "Alive"});
set_alphabet(alph);
// Populate scene;
for (unsigned i = 0; i < m_width; ++i)
{
for (unsigned j = 0; j < m_height; ++j)
{
unsigned state = (i ^ j) % 2;
QColor color(Qt::black);
GridItem *item = new GridItem((i ^ j) % 2 ? Qt::blue : Qt::white, (i ^ j) % 2 ? "Alive" : "Dead");
GridItem *item = new GridItem(stateColor_to_QColor(m_alph.getState(state).getColor()), QString::fromStdString(m_alph.getState(state).getStateLabel()));
//GridItem *item = new GridItem((i ^ j) % 2 ? Qt::blue : Qt::white, QString::fromStdString(m_alph.getState(state).getStateLabel()));
item->setPos(QPointF(i*GridItem::width(), j*GridItem::height()));
item->cell_pos = Coord{(int)i, (int)j};
item->cell_state = (i ^ j) % 2;
item->cell_state = state;
m_scene->addItem(item);
}
}
}
void GridView::set_alphabet(const Alphabet &alph)
{
m_alph = alph;
}
void GridView::copy_grid(const Grid &grid)
{
m_scene->clear();
// Populate scene;
for (size_t i = 0; i < grid.get_col(); ++i)
for (unsigned i = 0; i < m_width; ++i)
{
for (size_t j = 0; j < grid.get_rows(); ++j)
for (unsigned j = 0; j < m_height; ++j)
{
QColor color(Qt::black);
unsigned state = grid.get_state(j, i);
// TODO : récupérer state color
GridItem *item = new GridItem((i ^ j) % 2 ? Qt::blue : Qt::white, (i ^ j) % 2 ? "Alive" : "Dead");
unsigned state = (i ^ j) % 2;
GridItem *item = new GridItem(stateColor_to_QColor(m_alph.getState(state).getColor()), QString::fromStdString(m_alph.getState(state).getStateLabel()));
//GridItem *item = new GridItem((i ^ j) % 2 ? Qt::blue : Qt::white, (i ^ j) % 2 ? "Alive" : "Dead");
item->setPos(QPointF(i*GridItem::width(), j*GridItem::height()));
item->cell_pos = Coord{(int)i, (int)j};
item->cell_state = state;
m_scene->addItem(item);
}
}
m_width = grid.get_col();
m_height = grid.get_rows();
}
......@@ -181,7 +193,7 @@ Structure GridView::selected_cells() const
// on calcule la position du coin supérieur gauche de la sélection, afin de la considérer comme l'origine de de la structure
Coord origin = top_left_of_selection();
for (const auto& item : m_scene->selectedItems())
Q_FOREACH(const auto& item, m_scene->selectedItems())
{
GridItem* cell = static_cast<GridItem*>(item);
cells.push_back(std::make_pair(cell->cell_pos - origin, cell->cell_state));
......@@ -221,7 +233,7 @@ void GridView::paste_clipboard()
assert(item != nullptr);
item->cell_state = cell.second;
item->setBrush(QBrush(cell.second ? Qt::blue : Qt::white));
item->setBrush(QBrush(stateColor_to_QColor(m_alph.getState(cell.second).getColor())));
item->update();
}
......@@ -232,7 +244,7 @@ void GridView::delete_selection()
for (auto& abstract_item : m_scene->selectedItems())
{
GridItem* item = static_cast<GridItem*>(abstract_item);
item->setBrush(QBrush(Qt::white));
item->setBrush(QBrush(stateColor_to_QColor(m_alph.getState(0).getColor())));
item->cell_state = 0;
item->update();
}
......@@ -243,7 +255,7 @@ Coord GridView::top_left_of_selection() const
{
// on calcule la position du coin supérieur gauche de la sélection
Coord selection_top_left = Coord{std::numeric_limits<int>::max(), std::numeric_limits<int>::max()};
for (const auto& item : m_scene->selectedItems())
Q_FOREACH(const auto& item, m_scene->selectedItems())
{
GridItem* cell = static_cast<GridItem*>(item);
if (cell->cell_pos.x < selection_top_left.x)
......@@ -340,12 +352,12 @@ bool detail::Graphics_view_zoom::eventFilter(QObject *object, QEvent *event) {
}
} else if (event->type() == QEvent::Wheel) {
QWheelEvent* wheel_event = static_cast<QWheelEvent*>(event);
if (wheel_event->angleDelta().y() != 0) {
double angle = wheel_event->angleDelta().y();
double factor = qPow(_zoom_factor_base, angle);
gentle_zoom(factor);
return true;
}
if (wheel_event->angleDelta().y() != 0) {
double angle = wheel_event->angleDelta().y();
double factor = qPow(_zoom_factor_base, angle);
gentle_zoom(factor);
return true;
}
}
Q_UNUSED(object)
return false;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment