20 #ifndef LIBREPCB_EDITOR_EDITABLELISTMODEL_H 21 #define LIBREPCB_EDITOR_EDITABLELISTMODEL_H 34 #include <optional.hpp> 82 : QAbstractTableModel(parent),
92 const T&
getValues() const noexcept {
return mValues; }
96 mDefaultValue = value;
101 mPlaceholderText = text;
102 emit dataChanged(index(mValues.count(), COLUMN_TEXT),
103 index(mValues.count(), COLUMN_TEXT));
107 emit beginResetModel();
109 emit endResetModel();
113 emit beginResetModel();
115 updateComboBoxItems();
116 emit endResetModel();
120 emit beginResetModel();
121 mDisplayTexts[value] = text;
122 emit endResetModel();
125 void setIcon(
const ValueType& value,
const QIcon& icon) noexcept {
126 emit beginResetModel();
127 mIcons[value] = icon;
128 emit endResetModel();
132 void add(
const QPersistentModelIndex& itemIndex) noexcept {
136 QMessageBox::critical(
nullptr, tr(
"Error"), tr(
"Invalid value."));
140 if (mValues.contains(*mNewValue)) {
141 QMessageBox::critical(
nullptr, tr(
"Error"),
142 tr(
"Value already contained in list."));
146 beginInsertRows(QModelIndex(), mValues.count(), mValues.count());
147 mValues.append(*mNewValue);
150 mNewValue = mDefaultValue;
151 emit dataChanged(index(mValues.count(), 0),
152 index(mValues.count(), _COLUMN_COUNT - 1));
155 void remove(
const QPersistentModelIndex& itemIndex) noexcept {
156 int row = itemIndex.data(Qt::EditRole).toInt();
157 if ((row >= 0) && (row < mValues.count())) {
158 beginRemoveRows(QModelIndex(), row, row);
159 mValues.removeAt(row);
164 void moveUp(
const QPersistentModelIndex& itemIndex) noexcept {
165 int row = itemIndex.data(Qt::EditRole).toInt();
167 mValues.move(row, row - 1);
168 emit dataChanged(index(row - 1, 0), index(row, _COLUMN_COUNT - 1));
172 void moveDown(
const QPersistentModelIndex& itemIndex) noexcept {
173 int row = itemIndex.data(Qt::EditRole).toInt();
174 if (row < (mValues.count() - 1)) {
175 mValues.move(row, row + 1);
176 emit dataChanged(index(row, 0), index(row + 1, _COLUMN_COUNT - 1));
181 int rowCount(
const QModelIndex& parent = QModelIndex())
const override {
182 if (!parent.isValid()) {
183 return mValues.count() + 1;
188 int columnCount(
const QModelIndex& parent = QModelIndex())
const override {
189 if (!parent.isValid()) {
190 return _COLUMN_COUNT;
195 QVariant
data(
const QModelIndex& index,
196 int role = Qt::DisplayRole)
const override {
197 if (!index.isValid()) {
201 tl::optional<ValueType> value = mNewValue;
202 if ((index.row() >= 0) && (index.row() < mValues.count())) {
203 value = mValues.at(index.row());
205 bool showPlaceholder = (index.row() == mValues.count()) &&
206 ((!value) || getDisplayText(*value).isEmpty());
207 switch (index.column()) {
210 case Qt::DisplayRole:
211 return showPlaceholder
213 : (value ? getDisplayText(*value) : QString());
214 case Qt::DecorationRole:
215 return value ? mIcons.value(*value) : QIcon();
217 return value ? getDataForValue(*value) : QVariant();
218 case Qt::ForegroundRole:
219 if (showPlaceholder) {
220 QColor color = qApp->palette().text().color();
222 return QBrush(color);
227 return QVariant::fromValue(mComboBoxItems);
232 case COLUMN_ACTIONS: {
247 QVariant
headerData(
int section, Qt::Orientation orientation,
248 int role = Qt::DisplayRole)
const override {
249 if (orientation == Qt::Horizontal) {
250 if (role == Qt::DisplayRole) {
258 }
else if (orientation == Qt::Vertical) {
259 bool isLastRow = section >= mValues.count();
260 if (role == Qt::DisplayRole) {
261 return isLastRow ? tr(
"New:") : QString::number(section + 1);
262 }
else if (role == Qt::TextAlignmentRole) {
263 return QVariant(Qt::AlignRight | Qt::AlignVCenter);
269 Qt::ItemFlags
flags(
const QModelIndex& index)
const override {
270 Qt::ItemFlags f = QAbstractTableModel::flags(index);
271 if (index.isValid() && (index.row() == mValues.count())) {
272 f |= Qt::ItemIsEditable;
277 bool setData(
const QModelIndex& index,
const QVariant& value,
278 int role = Qt::EditRole)
override {
279 bool isLastRow = index.row() >= mValues.count();
281 if ((index.column() == COLUMN_TEXT) && role == Qt::EditRole) {
283 mNewValue = convertInputValue(value, mDefaultValue);
285 emit dataChanged(index, index);
297 return mDisplayTexts.value(value, value.toStr());
301 return value.toDisplayString();
309 return mDisplayTexts.value(value, value);
314 return value.toStr();
324 const QVariant& input,
const tl::optional<Uuid>& tag)
const noexcept {
330 const QVariant& input,
const tl::optional<QString>& tag)
const noexcept {
332 QString str = input.toString().trimmed();
333 return str.isEmpty() ? tl::nullopt : tl::make_optional(str);
337 const QVariant& input,
const tl::optional<QUrl>& tag)
const noexcept {
339 QUrl url = QUrl::fromUserInput(input.toString());
340 return url.isValid() ? tl::make_optional(url) : tl::nullopt;
344 mComboBoxItems.clear();
345 foreach (
const ValueType& choice, mChoices) {
347 getDataForValue(choice)};
348 mComboBoxItems.append(item);
350 mComboBoxItems.sort();
void setIcon(const ValueType &value, const QIcon &icon) noexcept
Definition: editablelistmodel.h:125
Definition: editablelistmodel.h:77
Qt::ItemFlags flags(const QModelIndex &index) const override
Definition: editablelistmodel.h:269
QString getDisplayText(const QUrl &value) const noexcept
Definition: editablelistmodel.h:300
A generic QAbstractTableModel subclass to view and edit list of various data types.
Definition: editablelistmodel.h:73
T mChoices
Definition: editablelistmodel.h:354
Definition: comboboxdelegate.h:47
void setPlaceholderText(const QString &text) noexcept
Definition: editablelistmodel.h:100
Definition: occmodel.cpp:77
void setValues(const T &values) noexcept
Definition: editablelistmodel.h:106
int columnCount(const QModelIndex &parent=QModelIndex()) const override
Definition: editablelistmodel.h:188
QString getDisplayText(const QString &value) const noexcept
Definition: editablelistmodel.h:304
tl::optional< QString > convertInputValue(const QVariant &input, const tl::optional< QString > &tag) const noexcept
Definition: editablelistmodel.h:329
const T & getValues() const noexcept
Definition: editablelistmodel.h:92
void moveDown(const QPersistentModelIndex &itemIndex) noexcept
Definition: editablelistmodel.h:172
T::value_type ValueType
Definition: editablelistmodel.h:74
void updateComboBoxItems() noexcept
Definition: editablelistmodel.h:343
QHash< ValueType, QString > mDisplayTexts
Definition: editablelistmodel.h:359
EditableListModel(QObject *parent=nullptr) noexcept
Definition: editablelistmodel.h:81
QString mPlaceholderText
Definition: editablelistmodel.h:358
tl::optional< Uuid > convertInputValue(const QVariant &input, const tl::optional< Uuid > &tag) const noexcept
Definition: editablelistmodel.h:323
QVariant getDataForValue(const Uuid &value) const noexcept
Definition: editablelistmodel.h:313
QVariant getDataForValue(const QUrl &value) const noexcept
Definition: editablelistmodel.h:317
Definition: comboboxdelegate.h:52
void add(const QPersistentModelIndex &itemIndex) noexcept
Definition: editablelistmodel.h:132
void setDefaultValue(const ValueType &value) noexcept
Definition: editablelistmodel.h:95
~EditableListModel() noexcept
Definition: editablelistmodel.h:89
ComboBoxDelegate::Items mComboBoxItems
Definition: editablelistmodel.h:361
tl::optional< ValueType > mNewValue
Definition: editablelistmodel.h:357
Column
Definition: editablelistmodel.h:77
QHash< ValueType, QIcon > mIcons
Definition: editablelistmodel.h:360
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
Definition: editablelistmodel.h:277
EditableListModelType
Definition: editablelistmodel.h:46
void setDisplayText(const ValueType &value, const QString &text) noexcept
Definition: editablelistmodel.h:119
int rowCount(const QModelIndex &parent=QModelIndex()) const override
Definition: editablelistmodel.h:181
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
Definition: editablelistmodel.h:195
QString getDisplayText(const Uuid &value) const noexcept
Definition: editablelistmodel.h:296
QVariant getDataForValue(const QString &value) const noexcept
Definition: editablelistmodel.h:319
void setChoices(const T &choices) noexcept
Definition: editablelistmodel.h:112
The Uuid class is a replacement for QUuid to get UUID strings without {} braces.
Definition: uuid.h:58
static tl::optional< Uuid > tryFromString(const QString &str) noexcept
Try creating a Uuid from a string, returning empty optional if invalid.
Definition: uuid.cpp:119
tl::optional< QUrl > convertInputValue(const QVariant &input, const tl::optional< QUrl > &tag) const noexcept
Definition: editablelistmodel.h:336
void moveUp(const QPersistentModelIndex &itemIndex) noexcept
Definition: editablelistmodel.h:164
T mValues
Definition: editablelistmodel.h:355
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
Definition: editablelistmodel.h:247
tl::optional< ValueType > mDefaultValue
Definition: editablelistmodel.h:356