16 template<CtString RoleArg, auto GetterArg>
19 static constexpr auto Getter = GetterArg;
20 static constexpr auto Role = RoleArg;
23 template<CtString RoleArg, auto GetterArg>
33 const QVector<FieldGetter_t> Fields_;
34 const QHash<int, QByteArray> Roles_;
36 template<
typename... Fields>
39 , Fields_ { +[] (
const T& t) -> QVariant {
return t.*(Fields::Getter); }... }
49 QVariant
GetData (
int row,
int,
int role)
const override
51 if (
const auto getter = Fields_.value (role - this->DataRole - 1))
52 return getter (this->
Items_.at (row));
56 QHash<int, QByteArray> MakeRoles (QVector<QByteArray> fields)
const
59 result.reserve (result.size () + fields.size ());
60 for (
int i = 0; i < fields.size (); ++i)
61 result [this->
DataRole + i + 1] = std::move (fields [i]);
74 template<Qt::ItemDataRole Role>
75 using RoleTag = std::integral_constant<Qt::ItemDataRole, Role>;
81 static Qt::ItemFlags
GetFlags (
auto&&...) {
return {}; }
82 static bool SetData (
auto&&...) {
return false; }
96 template<
typename... Params>
97 requires (std::is_same_v<Param, Params> || ...)
105 template<auto IconField>
108 using Extension::Extension;
114 return item.*IconField;
120 using ParameterizedExtension::ParameterizedExtension;
124 return Param_.contains (column) ? Qt::ItemIsEditable : Qt::ItemFlags {};
128 template<auto CheckField>
131 using Extension::Extension;
135 return column ? Qt::ItemFlags {} : Qt::ItemIsUserCheckable;
143 if constexpr (std::is_same_v<std::decay_t<
decltype (item.*CheckField)>, Qt::CheckState>)
144 return item.*CheckField;
145 else if constexpr (std::is_same_v<std::decay_t<
decltype (item.*CheckField)>,
bool>)
146 return item.*CheckField ? Qt::Checked : Qt::Unchecked;
148 static_assert (
false,
"expected Qt::CheckState or bool field");
151 template<
typename Item>
152 static bool SetData (Item& item,
int,
int column,
const QVariant& value,
int role)
154 if (role != Qt::CheckStateRole || column)
157 const auto state = value.value<Qt::CheckState> ();
158 if constexpr (std::is_same_v<std::decay_t<
decltype (item.*CheckField)>, Qt::CheckState>)
159 item.*CheckField = state;
160 else if constexpr (std::is_same_v<std::decay_t<
decltype (item.*CheckField)>,
bool>)
161 item.*CheckField = state == Qt::Checked;
163 static_assert (
false,
"expected Qt::CheckState or bool field");
176 using ParameterizedExtension::ParameterizedExtension;
180 return column ? Qt::ItemFlags {} : Qt::ItemIsUserCheckable;
193 template<
typename Item>
194 bool SetData (Item&,
int row,
int column,
const QVariant& value,
int role)
196 if (role != Qt::CheckStateRole || column)
199 RowsStates_ [row] = value.value<Qt::CheckState> ();
204 template<
typename T,
typename... Extensions>
206 ,
public Extensions...
208 using FieldGetter_t = QVariant (*) (
const T&);
209 const QVector<FieldGetter_t> Fields_;
211 using FieldSetter_t = void (*) (T&,
const QVariant&);
212 const QVector<FieldSetter_t> Setters_;
214 template<
auto... Getter>
220 template<
auto... Member,
typename... ExtParams>
223 , Extensions { extParams }...
224 , Fields_ { +[] (
const T& t) -> QVariant {
return t.*Member; }... }
225 , Setters_ { +[] (T& t,
const QVariant& v) { t.*Member = v.value<std::decay_t<
decltype (t.*Member)>> (); }... }
229 Qt::ItemFlags
flags (
const QModelIndex&
index)
const override
232 flags |= (Extensions::GetFlags (
index.column ()) | ...);
236 bool setData (
const QModelIndex&
index,
const QVariant& value,
int role)
override
239 if ((Extensions::SetData (item,
index.row (),
index.column (), value, role) ||...))
245 if (role != Qt::EditRole)
248 Setters_ [
index.column ()] (item, value);
253 QVariant
GetData (
int row,
int column,
int role)
const override
255 const auto& item = this->
Items_ [row];
259 case Qt::DisplayRole:
261 if (
const auto getter = Fields_.value (column))
262 return getter (item);
264 case Qt::CheckStateRole:
266 case Qt::DecorationRole:
273 using Extensions::GetDataForRole...;
QModelIndex index(int row, int col, const QModelIndex &parent={}) const override
QModelIndex parent(const QModelIndex &) const override
static constexpr auto DataRole
Qt::ItemFlags flags(const QModelIndex &index) const override
ItemsModel(const std::tuple< ExtParams... > &extParams, const Field< Member > &... fields)
ItemsModel(const Field< Getter > &... fields)
QVariant GetData(int row, int column, int role) const override
static QVariant GetDataForRole(auto &&...)
bool setData(const QModelIndex &index, const QVariant &value, int role) override
QVariant GetData(int row, int, int role) const override
QVariant(*)(const T &) FieldGetter_t
QHash< int, QByteArray > roleNames() const override
QVector< QPair< QByteArray, FieldGetter_t > > FieldsList_t
RoledItemsModel(QObject *parent, Fields...) noexcept
std::integral_constant< Qt::ItemDataRole, Role > RoleTag
RoledMemberField< RoleArg, GetterArg > RoledMemberField_v
bool IsChecked(int row) const
QVariant GetDataForRole(detail::RoleTag< Qt::CheckStateRole >, const auto &, int row, int column)
bool SetData(Item &, int row, int column, const QVariant &value, int role)
QHash< int, Qt::CheckState > RowsStates_
static Qt::ItemFlags GetFlags(int column)
static Qt::ItemFlags GetFlags(int column)
static bool SetData(Item &item, int, int column, const QVariant &value, int role)
static QVariant GetDataForRole(detail::RoleTag< Qt::CheckStateRole >, const auto &item, int, int column)
static QVariant GetDataForRole(detail::RoleTag< Qt::DecorationRole >, const auto &item, int column)
Qt::ItemFlags GetFlags(int column) const
static constexpr auto Getter
static constexpr auto Role
static bool SetData(auto &&...)
static void GetDataForRole()
static Qt::ItemFlags GetFlags(auto &&...)
ParameterizedExtension(const std::tuple< Params... > &args)