propertyvisitors.hpp 3.15 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
\file propertyvisitors.hpp
\date 17/04/2021
\author Yann Boucher
\version 1
\brief Classes filles de PropertyVisitor

Fichier contenant diverses classes filles de PropertyVisitor permettant l'affichage sur l'interface, le chargement et la sauvegarder en JSON d'objets Property.
**/


#ifndef VISITORS_HPP
#define VISITORS_HPP

#include <stack>
#include <QVariant>

#include "property.hpp"
Eugene Pin's avatar
Eugene Pin committed
19
#include "neighborhoodDialog.hpp"
20

21
22
//! \brief Exception lancée lors d'une erreur liée aux visiteurs de propriétés.
class PropertyVisitorException : public std::exception
23
24
25
{
    std::string _msg;
public:
26
    PropertyVisitorException(const std::string& msg) : _msg(msg){}
27
28
29
30
31
32
33

    virtual const char* what() const noexcept override
    {
        return _msg.c_str();
    }
};

34
35
36
/**
\class UIBuilderVisitor

37
\brief Cette classe permet de remplir un widget fourni en argument avec une représentation interactive de Property.
38
**/
39
40


41
42
43
class UIBuilderVisitor : public PropertyVisitor
{
public:
44
45
46
    //! Construit le UIBuilderVisitor à partir d'un base_widget.
    //! \param base_widget le widget.
    //! \param destructive indique si l'on détruit le contenu déjà présent dans base_widget ou non.
47
48
49
50
51
52
53
54
    UIBuilderVisitor(QWidget* base_widget, bool destructive = true);

private:
    void add_widget(const std::string& prop_name, QWidget* ptr);
    void clear_layout(QLayout *layout);
    QWidget* current_widget();
    void push_array_widget(const Property& prop);
    QWidget *pop_widget();
Eugene Pin's avatar
Eugene Pin committed
55
    NeighborhoodDialog* neighborhoodDialog;
56
57
58
59
60
61
62
63
64
65
66

private:
    void visit(StringProperty& str);
    void visit(IntegerProperty& prop);
    void visit(CoordinateProperty& prop);
    void visit(PropertyList& list);

private:
    std::stack<QWidget*> m_widget_hierarchy;
};

67
68
/**
\class PropertySaverVisitor
69

70
\brief Cette classe permet de sauvegarder un ensemble de Property dans un object JSON donné.
71
**/
72
73
74
class PropertySaverVisitor : public PropertyVisitor
{
public:
75
    //! Construit le  PropertySaverVisitor.
76
    PropertySaverVisitor();
77
78
    //! Sauvegarde les données des Property visitées au format JSON dans un QJsonObject.
    QJsonObject save();
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

private:
    QVariant& current();
    void save_value(Property& prop, const QJsonValue& val);
    void push_object();
    void push_array();
    QJsonValue pop_value();

    void visit(StringProperty& prop);
    void visit(IntegerProperty& prop);
    void visit(CoordinateProperty& prop);
    void visit(PropertyList& list);

private:
    std::stack<QVariant> m_current_hierarchy;
};

96
97
98
/**
\class PropertyLoaderVisitor

99
\brief Cette classe permet de charger un ensemble de Property depuis un pbject JSON donné.
100
**/
101
102
103
class PropertyLoaderVisitor : public PropertyVisitor
{
public:
104
105
    //! Construit le PropertyLoaderVisitor à partir d'un QJsonObject.
    PropertyLoaderVisitor(const QJsonObject& root);
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122

private:
    QJsonValue& current();
    void enter_value(const QJsonValue& value);
    QJsonValue exit_value();
    QJsonValue fetch_value(Property& prop);

    void visit(StringProperty& prop);
    void visit(IntegerProperty& prop);
    void visit(CoordinateProperty& prop);
    void visit(PropertyList& prop);
private:
    std::stack<QJsonValue> m_current_hierarchy;
};


#endif // VISITORS_HPP