EX> // Inclusion du fichier d'entête CM> #include "actions/{{CODE_LOWER}}_action{{NAME_LOWER}}.h" CM> EX> // Inclure ensuite les éventuelles classes de définitions nécessaires à votre étape EX> EX> // Inclusion pour la gestion des rendus en cours d'étape CM> #include "documentinterface.h" CM> #include "painterinterface.h" CM> EX> // Pour afficher des messages à la console EX> #include EX> EX> // Pour inclure certaines fonctions mathématiques EX> #include EX> EX> // Constructeur du conteneur CM> {{CODE_UPPER}}_Action{{NAME}}::{{CODE_UPPER}}_Action{{NAME}}_dataContainer::{{CODE_UPPER}}_Action{{NAME}}_dataContainer() CM> { EX> _limitBuffer = 0.0; CM> } CM> EX> // Constructeur : appel du constructeur de la classe mère EX> // et initialisation des paramètres (valeurs par défaut) CM> {{CODE_UPPER}}_Action{{NAME}}::{{CODE_UPPER}}_Action{{NAME}}({{CODE_UPPER}}_Action{{NAME}}_dataContainer *dataContainer) : CT_AbstractActionForGraphicsView() CM> { CM> _dataContainer = dataContainer; CM> } CM> EX> // Destructeur CM> {{CODE_UPPER}}_Action{{NAME}}::~{{CODE_UPPER}}_Action{{NAME}}() CM> { CM> } CM> EX> // Méthodes caractéristiques de l'actions CM> QString {{CODE_UPPER}}_Action{{NAME}}::uniqueName() const CM> { CM> return QString(tr("{{CODE_UPPER}}_Action{{NAME}}")); CM> } CM> CM> QString {{CODE_UPPER}}_Action{{NAME}}::title() const CM> { CM> return QString(tr("Action RefPoint(Barycentre) Buffer")); CM> } CM> CM> QString {{CODE_UPPER}}_Action{{NAME}}::description() const CM> { CM> return QString(tr("Definir la limite du buffer d'un RefPoint(Barycentre)")); CM> } CM> CM> QIcon {{CODE_UPPER}}_Action{{NAME}}::icon() const CM> { CM> return QIcon(); // Pas d'icone ici, mais on pourrait utiliser le chemin d'une ressource Qt CM> } CM> CM> QString {{CODE_UPPER}}_Action{{NAME}}::type() const CM> { CM> return CT_AbstractAction::TYPE_INFORMATION; CM> } CM> EX> // Initialisation lors de la création CM> void {{CODE_UPPER}}_Action{{NAME}}::init() CM> { EX> // On utilise la méchote de la classe mère CM> CT_AbstractActionForGraphicsView::init(); CM> CM> if(nOptions() == 0) CM> { EX> // Create the 'option' widget if it was not already created CM> {{CODE_UPPER}}_Action{{NAME}}Options *option = new {{CODE_UPPER}}_Action{{NAME}}Options(this); CM> EX> // Add the options to the graphics view CM> graphicsView()->addActionOptions(option); CM> EX> // Put the default value of the options in the action bar EX> option->setLimitBuffer(_dataContainer->_limitBuffer); EX> EX> // Connect the manual modifications with the values and the scene CM> connect(option, SIGNAL(parametersChanged()), this, SLOT(update())); CM> EX> // Register the option to the superclass, so the hideOptions and showOptions is managed automatically CM> registerOption(option); CM> EX> // On ajoute les éléments graphiques à notre nouvelle scène EX> for (int i = 0 ; i < _dataContainer->_sceneList->size() ; i++) EX> { EX> document()->addItemDrawable(*(_dataContainer->_sceneList->at(i))); EX> } NC> // Do your initialization here CM> EX> // On met à jour la scène CM> document()->redrawGraphics(); CM> EX> //On adapte le champ de vue de la caméra en fonction de notre scène de points CM> dynamic_cast(document()->views().first())->camera()->fitCameraToVisibleItems(); CM> } CM> } CM> EX> // Lorsqu'on agit avec le rendu, il faut parfois le mettre à jour, via ce slot CM> void {{CODE_UPPER}}_Action{{NAME}}::update() CM> { EX> // On récupère le contenu des options CM> {{CODE_UPPER}}_Action{{NAME}}Options *option = static_cast<{{CODE_UPPER}}_Action{{NAME}}Options*>(optionAt(0)); CM> EX> // On met à jour le(s) paramètre(s) EX> _dataContainer->_limitBuffer = option->getLimitBuffer(); NC> // Update values of container here CM> EX> // On refait le rendu de la scene après avoir changé les paramètres, au cas où ils auraient une influence sur elle. CM> setDrawing3DChanged(); CM> document()->redrawGraphics(); CM> } CM> EX> // Méthodes pour l'intéraction CM> bool {{CODE_UPPER}}_Action{{NAME}}::mousePressEvent(QMouseEvent *e) CM> { CM> Q_UNUSED(e); CM> return false; CM> } CM> CM> bool {{CODE_UPPER}}_Action{{NAME}}::mouseMoveEvent(QMouseEvent *e) CM> { CM> Q_UNUSED(e); CM> return false; CM> } CM> CM> bool {{CODE_UPPER}}_Action{{NAME}}::mouseReleaseEvent(QMouseEvent *e) CM> { CM> Q_UNUSED(e); CM> return false; CM> } CM> CM> bool {{CODE_UPPER}}_Action{{NAME}}::wheelEvent(QWheelEvent *e) CM> { EX> // On récupère le contenu des options CM> {{CODE_UPPER}}_Action{{NAME}}Options *option = static_cast<{{CODE_UPPER}}_Action{{NAME}}Options*>(optionAt(0)); CM> EX> // On permet de modifier la valeur du paramètre avec la molette CM> if (e->modifiers() & Qt::ControlModifier) CM> { CM> if (e->angleDelta().y() > 0) CM> { EX> option->setLimitBuffer(option->getLimitBuffer() + 1.0); CM> } else if (e->angleDelta().y() < 0) CM> { EX> option->setLimitBuffer(option->getLimitBuffer() - 1.0); CM> } CM> EX> // Une fois le paramètre modifié, on met à jour la scène complète. CM> update(); CM> EX> // L'évènement s'est bien passé quelque chose à été fait : on retourne "vrai". CM> return true; CM> } CM> CM> return false; CM> } CM> CM> bool {{CODE_UPPER}}_Action{{NAME}}::keyPressEvent(QKeyEvent *e) CM> { CM> Q_UNUSED(e); CM> return false; CM> CM> } CM> CM> bool {{CODE_UPPER}}_Action{{NAME}}::keyReleaseEvent(QKeyEvent *e) CM> { CM> Q_UNUSED(e); CM> return false; CM> } CM> CM> void {{CODE_UPPER}}_Action{{NAME}}::draw(GraphicsViewInterface &view, PainterInterface &painter) CM> { CM> Q_UNUSED(view); CM> Q_UNUSED(painter); CM> } CM> CM> void {{CODE_UPPER}}_Action{{NAME}}::drawOverlay(GraphicsViewInterface &view, QPainter &painter) CM> { CM> Q_UNUSED(view); CM> Q_UNUSED(painter); CM> } CM> EX> // Méthode de copie de l'action CM> CT_AbstractAction* {{CODE_UPPER}}_Action{{NAME}}::createInstance() const CM> { CM> return new {{CODE_UPPER}}_Action{{NAME}}(_dataContainer); CM> }