]> rtime.felk.cvut.cz Git - hydro.git/blob - app-bohyn/src/forms.h
Added monitoring web system. Minor changes in regulator and in control.
[hydro.git] / app-bohyn / src / forms.h
1 # ifndef FORMS_H
2 # define FORMS_H
3
4 #include <QPair>
5 #include <QString>
6 #include <QVariant>
7 #include <QVariantMap>
8
9 #include "http.h"
10 #include "utils.h"
11
12 /* Form Errors */
13 typedef QMap<QString, QString> ErrorDict;
14 class ValidationError {
15   private:
16     QString msg;
17
18   public:
19     ValidationError(QString _msg): msg(_msg) {}
20
21     QString getMsg() { return msg; }
22 };
23
24
25 /* Widgets */
26 class Widget : public QObject {
27   Q_OBJECT;
28   public:
29     Widget(QObject *parent=0): QObject(parent) {}
30
31     virtual ~Widget() {};
32     
33     virtual QString render(QString name, QVariant value) const = 0;
34
35     virtual QVariant valueFromDatadict(const QueryDict &data, const FilesDict &, QString name) const {
36         return QVariant(data.value(name, ""));
37     }
38 };
39
40 class TextInput : public Widget {
41   public:
42     TextInput(QObject *parent=0): Widget(parent) {}
43
44     virtual QString render(QString name, QVariant value) const;
45
46 };
47
48 typedef QPair<QString, QString> SelectOption;
49 class Select : public Widget {
50   private:
51     QList<SelectOption> choices;
52     bool show_empty_row;
53
54   public:
55     Select(bool _show_empty_row=true, QObject *parent=0): Widget(parent), show_empty_row(_show_empty_row) {}
56
57     Select(const QList<SelectOption> &_choices, bool _show_empty_row=true, QObject *parent=0): Widget(parent), choices(_choices), show_empty_row(_show_empty_row) {}
58
59     void addOption(const SelectOption &option) {
60         choices.append(option);
61     }
62
63     virtual QString render(QString name, QVariant value) const;
64
65     virtual const QList<SelectOption> &getChoicesRef() const { return choices; }
66 };
67
68 class CheckboxInput : public Widget {
69   public:
70     CheckboxInput(QObject *parent=0): Widget(parent) {}
71
72     virtual QString render(QString name, QVariant value) const;
73
74     virtual QVariant valueFromDatadict(const QueryDict &data, const FilesDict &files, QString name) const;
75 };
76
77 class FileInput : public Widget {
78   public:
79     FileInput(QObject *parent=0): Widget(parent) {}
80
81     virtual QString render(QString name, QVariant value) const;
82
83     virtual QVariant valueFromDatadict(const QueryDict &data, const FilesDict &files, QString name) const;
84 };
85
86
87 /* Fields */
88 class Field : public QObject {
89   Q_OBJECT;
90   protected:
91     QString label;
92     bool required;
93     QVariant initial;
94     Widget *widget;
95
96   public:
97     Field(QString _label, bool _required, QVariant _initial, QObject *parent=0)
98         : QObject(parent), label(_label), required(_required), initial(_initial) {}
99
100     virtual ~Field() {};
101
102     virtual QString render(const QueryDict &data, QString field_template="%1") const;
103
104     virtual QVariant clean(QVariant value) const;
105
106     virtual QString getLabel() const { return label; }
107
108     virtual bool isRequired() const { return required; }
109
110     virtual QVariant getInitial() const { return initial; }
111
112     virtual Widget *getWidgetPtr() { return widget; }
113 };
114
115 class CharField : public Field {
116   public:
117     CharField(QString _label, bool _required, QVariant _initial="", QObject *parent=0);
118
119 };
120
121 class IntegerField : public Field {
122   public:
123     IntegerField(QString _label, bool _required, QVariant _initial="", QObject *parent=0);
124     
125     virtual QVariant clean(QVariant value) const;
126 };
127
128 class FloatField : public Field {
129   public:
130     FloatField(QString _label, bool _required, QVariant _initial="", QObject *parent=0);
131     
132     virtual QVariant clean(QVariant value) const;
133 };
134
135 class ChoiceField : public Field {
136   private:
137     const QList<SelectOption> &choices;
138
139   public:
140     ChoiceField(QString _label, const QList<SelectOption> &_choices, bool _required, QVariant _initial="", QObject *parent=0);
141
142     virtual QVariant clean(QVariant value) const;
143 };
144
145 class BooleanField : public Field {
146   public:
147     BooleanField(QString _label, bool _required, QVariant _initial=false, QObject *parent=0);
148     
149     virtual QVariant clean(QVariant value) const;
150 };
151
152 class FileField : public Field {
153   public:
154     FileField(QString _label, bool _required, QObject *parent=0);
155
156     virtual QVariant clean(QVariant value) const;
157 };
158
159
160 /* Form */
161 class Form : public QObject {
162   Q_OBJECT;
163   private:
164     bool is_bound;
165     QueryDict data;
166     FilesDict files;
167     ErrorDict errors;
168     QVariantMap cleaned_data;
169
170   public:
171     Form(QObject *parent=0): QObject(parent), is_bound(false) {}
172
173     virtual ~Form() {}
174
175     void bindData(const QueryDict &_data) {
176         is_bound = true;
177         data = _data;
178     }
179
180     void bindFiles(const FilesDict &_files) {
181         is_bound = true;
182         files = _files;
183     }
184
185     bool isBound() const { return is_bound; }
186
187     void addField(QString name, Field *field);
188
189     void setError(QString field_name, QString msg);
190
191     void fullClean();
192
193     bool isValid();
194
195     QString renderField(QString field_name, QString field_template="<p>\n\t%1\n\t%2\n\t%3\n</p>\n", QString label_template="<label for=\"%1\">%2</label>\n", QString error_template="<span class=\"errors\">%1</span>\n") const;
196
197     QList<QString> fieldNames() const;
198
199     const QVariantMap &getCleanedDataRef() const { return cleaned_data; }
200
201     Field *operator[](QString field_name) const;
202 };
203
204
205 # endif