Data model for settings/options updates
[qtrapids] / src / utest / options / Options.hpp
diff --git a/src/utest/options/Options.hpp b/src/utest/options/Options.hpp
new file mode 100644 (file)
index 0000000..083336a
--- /dev/null
@@ -0,0 +1,115 @@
+#ifndef _QTUIPLUS_OPTIONS_HPP_
+#define _QTUIPLUS_OPTIONS_HPP_
+
+#include <QPointer>
+#include <QHash>
+#include <QVector>
+#include <QString>
+#include <QAbstractItemModel>
+#include <QSharedPointer>
+
+namespace qtplus
+{
+
+class OptionsGroup;
+
+class Option
+{
+public:
+
+       Option(QString const& name, QVariant const& value)
+                       : name_(name)
+                       , value_(value) { }
+
+       QString const& name() const {
+               return name_;
+       }
+
+       QVariant const& value() const {
+               return value_;
+       }
+
+private:
+       QString name_;
+       QVariant value_;
+};
+
+class OptionsGroup
+{
+       typedef QVector<size_t> options_t;
+       typedef QHash<QString, size_t> index_t;
+
+public:
+
+       typedef SettingsModel* model_ptr;
+
+       OptionsGroup(QString const& name, model_ptr)
+                       : name_(name) { }
+
+       void addOption(QString const& name, QVariant const& value) {
+               if (idx_.find() != idx_.end()) {
+                       return false;
+               }
+
+               size_t pos = model_->addOption(this, name, value);
+               options_.push_back(pos);
+               idx_[name] = pos;
+               return true;
+       }
+
+       QString name() const {
+               return name_;
+       }
+
+       size_t optionsCount() const {
+               return options_.size();
+       }
+
+       size_t getOptionPos(size_t pos) const {
+               return ( (0 <= pos && pos < options_.size())
+                        ? options_[pos]
+                        : 0 );
+       }
+
+private:
+       QString name_;
+       model_ptr model_;
+       options_t options_;
+       index_t idx_;
+};
+
+class SettingsModel : public QAbstractItemModel
+{
+       Q_OBJECT;
+
+public:
+
+       SettingsModel(QObject *parent = 0);
+
+       typedef QSharedPointer<OptionsGroup> group_ptr;
+
+       QModelIndex index(int row, int col, const QModelIndex &parent = QModelIndex() ) const;
+       QModelIndex parent(const QModelIndex &child) const;
+       int rowCount(const QModelIndex &parent = QModelIndex() ) const;
+       int columnCount(const QModelIndex &parent = QModelIndex() ) const;
+       QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+
+       bool addGroup(QString const& name, SettingsModel*);
+       bool addOption(OptionsGroup *group, QString const& name, QVariant const& value);
+
+private:
+
+       typedef QVector<group_ptr> groups_t;
+       typedef QHash<QString, group_ptr> groups_index_t;
+       typedef QSharedPointer<Option> option_ptr;
+       typedef QVector<option_ptr> options_t;
+
+       groups_t groups_;
+       groups_index_t idx_;
+       options_t options_;
+};
+
+
+} // namespace qtplus
+
+#endif // _QTPLUS_OPTIONS_HPP_