Added Q_FUNC_INFO macros to some functions.
[qtrapids] / src / utest / options / Options.hpp
1 #ifndef _QTUIPLUS_OPTIONS_HPP_
2 #define _QTUIPLUS_OPTIONS_HPP_
3
4 #include <QPointer>
5 #include <QHash>
6 #include <QVector>
7 #include <QString>
8 #include <QAbstractItemModel>
9 #include <QSharedPointer>
10
11 namespace qtplus
12 {
13
14 class OptionsGroup;
15
16 class Option
17 {
18 public:
19
20         Option(QString const& name, QVariant const& value)
21                         : name_(name)
22                         , value_(value) { }
23
24         QString const& name() const {
25                 return name_;
26         }
27
28         QVariant const& value() const {
29                 return value_;
30         }
31
32 private:
33         QString name_;
34         QVariant value_;
35 };
36
37 class OptionsGroup
38 {
39         typedef QVector<size_t> options_t;
40         typedef QHash<QString, size_t> index_t;
41
42 public:
43
44         typedef SettingsModel* model_ptr;
45
46         OptionsGroup(QString const& name, model_ptr)
47                         : name_(name) { }
48
49         void addOption(QString const& name, QVariant const& value) {
50                 if (idx_.find() != idx_.end()) {
51                         return false;
52                 }
53
54                 size_t pos = model_->addOption(this, name, value);
55                 options_.push_back(pos);
56                 idx_[name] = pos;
57                 return true;
58         }
59
60         QString name() const {
61                 return name_;
62         }
63
64         size_t optionsCount() const {
65                 return options_.size();
66         }
67
68         size_t getOptionPos(size_t pos) const {
69                 return ( (0 <= pos && pos < options_.size())
70                          ? options_[pos]
71                          : 0 );
72         }
73
74 private:
75         QString name_;
76         model_ptr model_;
77         options_t options_;
78         index_t idx_;
79 };
80
81 class SettingsModel : public QAbstractItemModel
82 {
83         Q_OBJECT;
84
85 public:
86
87         SettingsModel(QObject *parent = 0);
88
89         typedef QSharedPointer<OptionsGroup> group_ptr;
90
91         QModelIndex index(int row, int col, const QModelIndex &parent = QModelIndex() ) const;
92         QModelIndex parent(const QModelIndex &child) const;
93         int rowCount(const QModelIndex &parent = QModelIndex() ) const;
94         int columnCount(const QModelIndex &parent = QModelIndex() ) const;
95         QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
96
97         bool addGroup(QString const& name, SettingsModel*);
98         bool addOption(OptionsGroup *group, QString const& name, QVariant const& value);
99
100 private:
101
102         typedef QVector<group_ptr> groups_t;
103         typedef QHash<QString, group_ptr> groups_index_t;
104         typedef QSharedPointer<Option> option_ptr;
105         typedef QVector<option_ptr> options_t;
106
107         groups_t groups_;
108         groups_index_t idx_;
109         options_t options_;
110 };
111
112
113 } // namespace qtplus
114
115 #endif // _QTPLUS_OPTIONS_HPP_