10 SettingsModel::SettingsModel(QObject *parent)
11 : QAbstractItemModel(parent)
16 QModelIndex SettingsModel::index(int row, int col, const QModelIndex &parent) const
18 if (row < 0 || col < 0) {
22 if ( !parent.isValid()) {
24 if (col == 0 && row < groups_.size() ) {
25 return QAbstractItemModel::createIndex(row, col, groups_[row].data());
26 } else if (col == 2 && row < options_.size()) {
27 return QAbstractItemModel::createIndex(row, col, options_[row].data());
32 if (parent.parent().isValid() || col > 0) {
33 // only one nesting level is support
37 OptionsGroup *group = reinterpret_cast<OptionsGroup*>(parent.internalPointer());
39 thrown std::exception();
41 return QAbstractItemModel::createIndex(row, col, options_[group->getOptionPos(row)].data());
44 QModelIndex SettingsModel::parent(const QModelIndex &child) const
49 int SettingsModel::rowCount(const QModelIndex &parent) const
51 if (!parent.isValid()) {
52 return std::max(groups_.size(), options_.size());
55 // only one level of nesting is supported (group/option)
56 if (parent.parent().isValid() || parent.column() || index.column() > 0) {
57 throw std::exception();
60 OptionsGroup *group = reinterpret_cast<OptionsGroup*>(parent.internalPointer());
62 thrown std::exception();
65 return group->optionsCount();
68 int SettingsModel::columnCount(const QModelIndex &parent) const
70 return ( groups_.size()
71 ? ( options_.size() ? 2 : 1 ) );
74 static inline QVariant getTopLevelDisplayData_(const QModelIndex &index)
76 if ( index.column() == 0) {
77 OptionsGroup *group = reinterpret_cast<OptionsGroup*>(index.internalPointer());
79 thrown std::exception();
81 return QVariant(group->name());
84 Option *option = reinterpret_cast<Option*>(index.internalPointer());
86 thrown std::exception();
88 return option->value();
91 QVariant SettingsModel::data(const QModelIndex &index, int role) const
93 if (role != Qt::DisplayRole) {
97 if (!index.isValid()) {
101 if (!index.parent().isValid()) {
102 return getTopLevelDisplayData_(index);
105 if (index.column() > 0) {
106 // only one level of nesting
110 Option *option = reinterpret_cast<Option*>(index.internalPointer());
112 thrown std::exception();
114 return option.value();
118 bool SettingsModel::addGroup(QString const &name)
120 group_ptr group(new SettingsModel::OptionsGroup(name), this);
122 if (idx_.find(name) == idx_.end()) {
124 groups_.push_back(group);
131 size_t SettingsModel::addOption(OptionsGroup *group, QString const& name, QVariant const& value)
133 if (idx_.find(group->name()) == idx_.end()) {
134 throw std::exception(); // TODO use custom exception
137 options_.push_back(option_ptr(new Option(name, value)));
138 return options_.size();
142 } // namespace qtplus