Commit 2ac00be6 authored by Yann Boucher's avatar Yann Boucher
Browse files

Improved encapsulation of GridItem

parent 44268bdc
...@@ -28,22 +28,27 @@ Cette classe représente le widget utilisé pour l'affichage et l'interaction av ...@@ -28,22 +28,27 @@ Cette classe représente le widget utilisé pour l'affichage et l'interaction av
#include "structurereader.hpp" #include "structurereader.hpp"
// FIXME : faire en sorte que le tooltip soit correctement mis à jour à chaque fois static QColor stateColor_to_QColor(const stateColor& sc)
{
return QColor::fromRgb(sc.getRed(), sc.getGreen(), sc.getBlue());
}
class GridItem : public QGraphicsRectItem class GridItem : public QGraphicsRectItem
{ {
public: public:
GridItem(GridView& in_gridview, QColor color, const QString& state_name, QGraphicsItem *parent = nullptr) GridItem(GridView& in_gridview, unsigned state = 0, Coord pos = Coord{0, 0}, QGraphicsItem *parent = nullptr)
: QGraphicsRectItem(0, 0, GridItem::width(), GridItem::height(), parent), grid_view(in_gridview), m_state_name(state_name) : QGraphicsRectItem(0, 0, GridItem::width(), GridItem::height(), parent), m_grid_view(in_gridview)
{ {
setAcceptHoverEvents(true); setAcceptHoverEvents(true);
setPen(QPen(QBrush(color), 0));
setBrush(QBrush(color));
setToolTip(m_state_name); setToolTip(m_state_name);
setFlag(QGraphicsItem::ItemIsSelectable); setFlag(QGraphicsItem::ItemIsSelectable);
setAcceptDrops(true); setAcceptDrops(true);
view = nullptr; set_state(state);
set_grid_pos(pos);
setPen(QPen(brush(), 0));
m_view = nullptr;
} }
static int width() static int width()
...@@ -51,16 +56,35 @@ public: ...@@ -51,16 +56,35 @@ public:
static int height() static int height()
{ return 20; } { return 20; }
unsigned state() const
{ return m_cell_state; }
void set_state(unsigned s)
{
const Alphabet& alph = m_grid_view.alphabet();
setBrush(QBrush(stateColor_to_QColor(alph.getState(s).getColor())));
setToolTip(QString::fromStdString(alph.getState(s).getStateLabel()));
m_cell_state = s;
update();
}
Coord grid_pos() const
{ return m_cell_pos; }
void set_grid_pos(Coord c)
{
setPos(QPointF(c.x*GridItem::width(), c.y*GridItem::height()));
m_cell_pos = c;
}
protected: protected:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) override void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) override
{ {
if (!view) if (!m_view)
{ {
assert(scene()->views().size() != 0); assert(scene()->views().size() != 0);
view = scene()->views().first(); m_view = scene()->views().first();
} }
QSizeF screen_size = view->transform().mapRect(sceneBoundingRect()).size(); QSizeF screen_size = m_view->transform().mapRect(sceneBoundingRect()).size();
QRectF rect = QRectF(0, 0, width(), height()); QRectF rect = QRectF(0, 0, width(), height());
...@@ -107,26 +131,17 @@ protected: ...@@ -107,26 +131,17 @@ protected:
return; return;
} }
grid_view.paste_structure_at(cell_pos, s); m_grid_view.paste_structure_at(m_cell_pos, s);
} }
// infos associées à la cellule affichée
public:
unsigned cell_state;
Coord cell_pos;
QGraphicsView* view;
GridView& grid_view;
private: private:
Coord m_cell_pos;
unsigned m_cell_state;
QString m_state_name; QString m_state_name;
QGraphicsView* m_view;
GridView& m_grid_view;
}; };
static QColor stateColor_to_QColor(const stateColor& sc)
{
return QColor::fromRgb(sc.getRed(), sc.getGreen(), sc.getBlue());
}
void GridGraphicsView::mousePressEvent(QMouseEvent *event) void GridGraphicsView::mousePressEvent(QMouseEvent *event)
{ {
QGraphicsItem* gitem_ptr = itemAt(event->pos()); QGraphicsItem* gitem_ptr = itemAt(event->pos());
...@@ -137,9 +152,7 @@ void GridGraphicsView::mousePressEvent(QMouseEvent *event) ...@@ -137,9 +152,7 @@ void GridGraphicsView::mousePressEvent(QMouseEvent *event)
if (item) if (item)
{ {
unsigned state = m_gridview.current_pen(); unsigned state = m_gridview.current_pen();
item->setBrush(QBrush(stateColor_to_QColor(m_gridview.alphabet().getState(state).getColor()))); item->set_state(state);
item->cell_state = state;
item->update();
} }
} }
else if (event->button() == Qt::RightButton && item) else if (event->button() == Qt::RightButton && item)
...@@ -162,9 +175,7 @@ void GridGraphicsView::mouseMoveEvent(QMouseEvent *event) ...@@ -162,9 +175,7 @@ void GridGraphicsView::mouseMoveEvent(QMouseEvent *event)
if (item) if (item)
{ {
unsigned state = m_gridview.current_pen(); unsigned state = m_gridview.current_pen();
item->setBrush(QBrush(stateColor_to_QColor(m_gridview.alphabet().getState(state).getColor()))); item->set_state(state);
item->cell_state = state;
item->update();
} }
} }
else if (event->buttons() == Qt::RightButton && item) else if (event->buttons() == Qt::RightButton && item)
...@@ -272,11 +283,9 @@ void GridView::copy_grid(const Grid &grid) ...@@ -272,11 +283,9 @@ void GridView::copy_grid(const Grid &grid)
Coord pos = {static_cast<int>(i), static_cast<int>(j)}; Coord pos = {static_cast<int>(i), static_cast<int>(j)};
unsigned state = grid.get_state(pos); unsigned state = grid.get_state(pos);
GridItem *item = new GridItem(*this, stateColor_to_QColor(m_alph.getState(state).getColor()), QString::fromStdString(m_alph.getState(state).getStateLabel())); GridItem *item = new GridItem(*this, state);
//GridItem *item = new GridItem((i ^ j) % 2 ? Qt::blue : Qt::white, (i ^ j) % 2 ? "Alive" : "Dead"); item->set_grid_pos(Coord{(int)i, (int)j});
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_scene->addItem(item);
} }
} }
...@@ -296,7 +305,7 @@ Grid GridView::get_grid() const ...@@ -296,7 +305,7 @@ Grid GridView::get_grid() const
Coord pos; Coord pos;
pos.x = i; pos.x = i;
pos.y = j; pos.y = j;
grid.set_cell(pos, item->cell_state); grid.set_cell(pos, item->state());
} }
} }
...@@ -320,7 +329,7 @@ Structure GridView::selected_cells() const ...@@ -320,7 +329,7 @@ Structure GridView::selected_cells() const
Q_FOREACH(const auto& item, m_scene->selectedItems()) Q_FOREACH(const auto& item, m_scene->selectedItems())
{ {
GridItem* cell = static_cast<GridItem*>(item); GridItem* cell = static_cast<GridItem*>(item);
cells.push_back(std::make_pair(cell->cell_pos - origin, cell->cell_state)); cells.push_back(std::make_pair(cell->grid_pos() - origin, cell->state()));
} }
return Structure(cells.begin(), cells.end()); return Structure(cells.begin(), cells.end());
} }
...@@ -357,9 +366,7 @@ void GridView::fill_selection(unsigned state) ...@@ -357,9 +366,7 @@ void GridView::fill_selection(unsigned state)
for (auto& abstract_item : m_scene->selectedItems()) for (auto& abstract_item : m_scene->selectedItems())
{ {
GridItem* item = static_cast<GridItem*>(abstract_item); GridItem* item = static_cast<GridItem*>(abstract_item);
item->setBrush(QBrush(stateColor_to_QColor(m_alph.getState(state).getColor()))); item->set_state(state);
item->cell_state = state;
item->update();
} }
} }
...@@ -378,9 +385,7 @@ void GridView::paste_structure_at(Coord origin, const Structure &s) ...@@ -378,9 +385,7 @@ void GridView::paste_structure_at(Coord origin, const Structure &s)
GridItem* item = item_at(corrected); GridItem* item = item_at(corrected);
assert(item != nullptr); assert(item != nullptr);
item->cell_state = cell.second; item->set_state(cell.second);
item->setBrush(QBrush(stateColor_to_QColor(m_alph.getState(cell.second).getColor())));
item->update();
} }
} }
...@@ -391,10 +396,10 @@ Coord GridView::top_left_of_selection() const ...@@ -391,10 +396,10 @@ Coord GridView::top_left_of_selection() const
Q_FOREACH(const auto& item, m_scene->selectedItems()) Q_FOREACH(const auto& item, m_scene->selectedItems())
{ {
GridItem* cell = static_cast<GridItem*>(item); GridItem* cell = static_cast<GridItem*>(item);
if (cell->cell_pos.x < selection_top_left.x) if (cell->grid_pos().x < selection_top_left.x)
selection_top_left.x = cell->cell_pos.x; selection_top_left.x = cell->grid_pos().x;
if (cell->cell_pos.y < selection_top_left.y) if (cell->grid_pos().y < selection_top_left.y)
selection_top_left.y = cell->cell_pos.y; selection_top_left.y = cell->grid_pos().y;
} }
return selection_top_left; return selection_top_left;
......
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