diff --git a/forms/neighborhoodDialog.ui b/forms/neighborhoodDialog.ui new file mode 100644 index 0000000000000000000000000000000000000000..7232c50fd49cc206ccdd2c3a1306a1208a305d93 --- /dev/null +++ b/forms/neighborhoodDialog.ui @@ -0,0 +1,177 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>NeighborhoodDialog</class> + <widget class="QDialog" name="NeighborhoodDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>894</width> + <height>441</height> + </rect> + </property> + <property name="windowTitle"> + <string>Dialog</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <layout class="QHBoxLayout" name="mainLayout" stretch="1,0"> + <item> + <widget class="QWidget" name="grid" native="true"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="minimumSize"> + <size> + <width>100</width> + <height>100</height> + </size> + </property> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="0" column="0"> + <widget class="GridView" name="grid_view"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="settingsLayout_2"> + <property name="sizeConstraint"> + <enum>QLayout::SetDefaultConstraint</enum> + </property> + <item> + <layout class="QFormLayout" name="gridDimLayout_2"> + <property name="fieldGrowthPolicy"> + <enum>QFormLayout::FieldsStayAtSizeHint</enum> + </property> + <item row="0" column="0"> + <widget class="QLabel" name="widthLabel_2"> + <property name="text"> + <string>Width :</string> + </property> + <property name="buddy"> + <cstring>widthSpinBox</cstring> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QSpinBox" name="widthSpinBox_2"> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>9999</number> + </property> + <property name="value"> + <number>10</number> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="heightLabel_2"> + <property name="text"> + <string>Height :</string> + </property> + <property name="buddy"> + <cstring>heightSpinBox</cstring> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QSpinBox" name="heightSpinBox_2"> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>9999</number> + </property> + <property name="value"> + <number>10</number> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QPushButton" name="validateGridDim_2"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>OK</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>GridView</class> + <extends>QFrame</extends> + <header>gridview.hpp</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>NeighborhoodDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>NeighborhoodDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/forms/neighborhoodWidget.ui b/forms/neighborhoodWidget.ui index 591fcdf656b936df76add68ec2e8f1d4409edc76..8ec74b90aeac901bc04338bbb8c584e33a104db3 100644 --- a/forms/neighborhoodWidget.ui +++ b/forms/neighborhoodWidget.ui @@ -116,15 +116,9 @@ </layout> </item> <item> - <widget class="QPushButton" name="validationButton"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Validate</string> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> </widget> </item> diff --git a/include/gridview.hpp b/include/gridview.hpp index a73228d0aa24f7f263bff43f4a08a7a951401e15..1d1e367db22b2c4970036398c11366f59cf76318 100644 --- a/include/gridview.hpp +++ b/include/gridview.hpp @@ -88,6 +88,11 @@ public: //! \param checked_state L'état lorsqu'une cellule est sélectionnée //! \param unchecked_state L'état d'une cellule non sélectionnée void enable_toggle_mode(unsigned checked_state, unsigned unchecked_state = 0); + //! \brief Ajoute une règle au mode "toggle", qui permet de changer l'état d'une cellule de manière cyclique en cliquant dessus, passant d'un état check à uncheck, et inversement si cliqué à nouveau. + //! \brief Cette fonction permet d'ajouter une nouvellle paire d'états cycliques, pour pouvoir par exemple permettre de passer entre 0-1 et 2-3, indépendamment. + //! \param checked_state L'état d'une cellule sélectionnée + //! \param unchecked_state L'état d'une cellule non sélectionnée + void add_toggle_rule(unsigned checked_state, unsigned unchecked_state = 0); //! \brief Désactive le mode "toggle". void disable_toggle_mode(); //! \brief Retourne un booléen indiquant si le mode actuel est le mode "toggle". @@ -170,7 +175,7 @@ private: QPixmap m_grid_pixmap; Grid m_grid; bool m_in_toggle_mode; - unsigned m_checked_state, m_unchecked_state; + std::vector<std::pair<unsigned, unsigned>> m_toggle_states; std::vector<QGraphicsRectItem*> m_selection_rects; bool m_handling_rubberband; DragDropHandlerItem* m_drag_drop_handler; diff --git a/include/neighborhoodWidget.hpp b/include/neighborhoodDialog.hpp similarity index 57% rename from include/neighborhoodWidget.hpp rename to include/neighborhoodDialog.hpp index 92a01f6ff86e42a805538394620b4b495d06f570..f37e0d9a6debc5d2f79b7f8ef631953e8632428b 100644 --- a/include/neighborhoodWidget.hpp +++ b/include/neighborhoodDialog.hpp @@ -1,39 +1,40 @@ -#ifndef NEIGHBORHOODWIDGET_HPP -#define NEIGHBORHOODWIDGET_HPP +#ifndef NEIGHBORHOODDIALOG_HPP +#define NEIGHBORHOODDIALOG_HPP #include <QDialog> #include "neighborhood.hpp" #include "gridview.hpp" namespace Ui { - class NeighborhoodWidget; + class NeighborhoodDialog; } //! \brief Fenêtre de dialogue permettant de choisir les voisins d'une cellule de manière graphique. -class NeighborhoodWidget : public QWidget +class NeighborhoodDialog : public QDialog { Q_OBJECT Coord currentPoint; public: - explicit NeighborhoodWidget(QWidget *parent = nullptr); - ~NeighborhoodWidget(); + explicit NeighborhoodDialog(QWidget *parent = nullptr); + ~NeighborhoodDialog(); //! \brief Retourne le voisinage Neighborhood* getVoisinage() const; - QPushButton* getValidateButton() const; - GridView& getGridView() const ; public slots: Neighborhood& getNeighborhood() const; +protected: + void done(int r); + private slots: private: - Ui::NeighborhoodWidget *ui; + Ui::NeighborhoodDialog *ui; }; -#endif // NEIGHBORHOODWIDGET_HPP +#endif // NEIGHBORHOODDIALOG_HPP diff --git a/include/property.hpp b/include/property.hpp index e69b5b99bf0f621257eb1f283ace7a6282f01c17..62cfff92cf65ddc41efb840bf91009bf3b3b0883 100644 --- a/include/property.hpp +++ b/include/property.hpp @@ -33,7 +33,7 @@ Fichier définissant la classe Property représentant une propriété chargable, #include "coord.hpp" #include "neighborhood.hpp" -#include "neighborhoodWidget.hpp" +#include "neighborhoodDialog.hpp" struct StringProperty; struct IntegerProperty; diff --git a/src/gridview.cpp b/src/gridview.cpp index 7ac079364521b0cf23203105b4fb63f24965e4e6..2ad8a9a391c08348b9a33f4afe7960d1ac309c04 100644 --- a/src/gridview.cpp +++ b/src/gridview.cpp @@ -353,8 +353,12 @@ unsigned GridView::current_pen() const void GridView::enable_toggle_mode(unsigned checked_state, unsigned unchecked_state) { m_in_toggle_mode = true; - m_checked_state = checked_state; - m_unchecked_state = unchecked_state; + add_toggle_rule(checked_state, unchecked_state); +} + +void GridView::add_toggle_rule(unsigned checked_state, unsigned unchecked_state) +{ + m_toggle_states.push_back({checked_state, unchecked_state}); } void GridView::disable_toggle_mode() @@ -530,10 +534,19 @@ void GridView::click_on(Coord coord) else { unsigned prev_state = get_grid().get_state(coord); - if (prev_state == m_checked_state) - set_cell_state(coord, m_unchecked_state); - else - set_cell_state(coord, m_checked_state); + for (auto toggle_pair : m_toggle_states) + { + if (prev_state == toggle_pair.first) + { + set_cell_state(coord, toggle_pair.second); + break; + } + else if (prev_state == toggle_pair.second) + { + set_cell_state(coord, toggle_pair.first); + break; + } + } } } diff --git a/src/interface.cpp b/src/interface.cpp index 960531506d7a35dcc3388de2d629144b441ffaed..3ea4d80c30b31ec061a509d03c80003cab21b316 100644 --- a/src/interface.cpp +++ b/src/interface.cpp @@ -10,7 +10,7 @@ #include "propertyvisitors.hpp" #include "modelloadingdialog.hpp" #include "configurationloadingdialog.hpp" -#include "neighborhoodWidget.hpp" +#include "neighborhoodDialog.hpp" #include <QJsonArray> #include <QDate> diff --git a/src/neighborhoodWidget.cpp b/src/neighborhoodDialog.cpp similarity index 72% rename from src/neighborhoodWidget.cpp rename to src/neighborhoodDialog.cpp index 6eb12789a0235294b45a93fa66e9e4b8327d8c4b..0e708b3538a4e2a5fdde97255e163ad7ed179500 100644 --- a/src/neighborhoodWidget.cpp +++ b/src/neighborhoodDialog.cpp @@ -1,11 +1,11 @@ -#include "neighborhoodWidget.hpp" -#include "ui_neighborhoodWidget.h" +#include "neighborhoodDialog.hpp" +#include "ui_neighborhoodDialog.h" #include <QDate> #include <QMessageBox> -NeighborhoodWidget::NeighborhoodWidget(QWidget *parent) : - QWidget(parent), ui(new Ui::NeighborhoodWidget) +NeighborhoodDialog::NeighborhoodDialog(QWidget *parent) : + QDialog(parent), ui(new Ui::NeighborhoodDialog) { ui->setupUi(this); GridView& gv = *(*ui).grid_view; @@ -33,25 +33,34 @@ NeighborhoodWidget::NeighborhoodWidget(QWidget *parent) : // TODO le clic sur la cellule centrale } -NeighborhoodWidget::~NeighborhoodWidget() +NeighborhoodDialog::~NeighborhoodDialog() { delete ui; } -Neighborhood* NeighborhoodWidget::getVoisinage() const +void NeighborhoodDialog::done(int r) { - return nullptr; + if(QDialog::Accepted == r) // ok was pressed + { + + } + else // cancel, close or exc was pressed + { + QDialog::done(r); + return; + } } -QPushButton* NeighborhoodWidget::getValidateButton() const { - return ui->validationButton; +Neighborhood* NeighborhoodDialog::getVoisinage() const +{ + return nullptr; } -GridView& NeighborhoodWidget::getGridView() const{ +GridView& NeighborhoodDialog::getGridView() const{ return *(ui->grid_view); } -Neighborhood& NeighborhoodWidget::getNeighborhood() const +Neighborhood& NeighborhoodDialog::getNeighborhood() const { Neighborhood* newNeighborhood = new Neighborhood; Grid currentGrid = ui->grid_view->get_grid(); diff --git a/src/src.pro b/src/src.pro index c31a2e7f6e04961a85f7621a6413a3c0237e8564..deee726a9cd402853ef228240a9776df088ac03c 100644 --- a/src/src.pro +++ b/src/src.pro @@ -18,7 +18,7 @@ SOURCES += \ neighborhood_rules/arbitraryneighborhoodrule.cpp \ automaton.cpp \ gridview.cpp \ - neighborhoodWidget.cpp \ + neighborhoodDialog.cpp \ savingdialog.cpp \ transition_rules/circulartransition.cpp \ transition_rules/lifegametransition.cpp \ @@ -71,7 +71,7 @@ HEADERS += \ ../include/transition_rules/circulartransition.hpp \ ../include/transition_rules/totalistictransition.hpp \ ../include/modelloadingdialog.hpp \ - ../include/neighborhoodWidget.hpp \ + ../include/neighborhoodDialog.hpp \ ../include/configurationloadingdialog.hpp \ ../include/transition_rules/nonisotropictransition.hpp @@ -82,6 +82,7 @@ FORMS += \ ../forms/structurelibraryview.ui \ ../forms/modelloadingdialog.ui \ ../forms/neighborhoodWidget.ui \ + ../forms/neighborhoodDialog.ui \ ../forms/configurationloadingdialog.ui diff --git a/src/uibuildervisitor.cpp b/src/uibuildervisitor.cpp index d382ff588b35cd9066e68df779487ed04ceea764..44ba4ee15931d33a84684a84943058126182785e 100644 --- a/src/uibuildervisitor.cpp +++ b/src/uibuildervisitor.cpp @@ -1,6 +1,6 @@ #include "propertyvisitors.hpp" -#include "neighborhoodWidget.hpp" +#include "neighborhoodDialog.hpp" #include <QGroupBox> #include <QPushButton> @@ -186,17 +186,17 @@ void UIBuilderVisitor::visit(PropertyList &list) } }); QObject::connect(widgetGridNeighborhoodButton, &QPushButton::pressed, [&list]() { - NeighborhoodWidget* nw = new NeighborhoodWidget; - nw->show(); - QPushButton* validateButton = nw->getValidateButton(); + NeighborhoodDialog* nw = new NeighborhoodDialog; + nw->exec(); + /* QObject::connect(validateButton, &QPushButton::pressed, [&list, &nw] () { list.clear(); Neighborhood newNeighborhood = nw->getNeighborhood(); // TODO a finir list.push_back(); - }); - QObject::connect(validateButton, &QPushButton::pressed, nw, &QWidget::close ); + });*/ + // QObject::connect(validateButton, &QPushButton::pressed, nw, &QDialog::done ); }); } diff --git a/tests/tests.pro b/tests/tests.pro index 4899145823e7b04cb3629ec53cd12eb0b0d36d9e..b82a3628eec63aba9d495598ccc82a6d4fcd5d27 100644 --- a/tests/tests.pro +++ b/tests/tests.pro @@ -22,6 +22,7 @@ SOURCES += \ ../src/history.cpp \ ../src/grid.cpp \ ../src/neighborhood_rules/mooreNeighborhoodRule.cpp \ + ../src/neighborhood_rules/vonNeumannNeighborhoodRule.cpp \ ../src/transition_rules/lifegametransition.cpp \ ../src/transition_rules/circulartransition.cpp \ ../src/transition_rules/totalistictransition.cpp \