5 #include <QAbstractTableModel> 7 #include <QStandardItem> 8 #include <boost/optional.hpp> 10 #include <pajlada/signals/signalholder.hpp> 14 template <
typename TVectorItem>
16 pajlada::Signals::SignalHolder
20 : QAbstractTableModel(parent)
21 , columnCount_(columnCount)
25 this->headerData_.emplace_back();
34 if (args.caller ==
this)
40 assert(index >= 0 && index <= this->rows_.size());
43 std::vector<QStandardItem *> row = this->
createRow();
49 this->beginInsertRows(QModelIndex(), index, index);
50 this->rows_.insert(this->rows_.begin() + index,
52 this->endInsertRows();
56 for (
const TVectorItem &item : vec->
raw())
65 this->managedConnect(vec->
itemRemoved, [
this](
auto args) {
66 if (args.caller == this)
71 int row = this->getModelIndexFromVectorIndex(args.index);
72 assert(row >= 0 && row <= this->rows_.size());
75 std::vector<QStandardItem *> items = this->rows_[row].items;
77 this->beginRemoveRows(QModelIndex(), row, row);
78 this->rows_.erase(this->rows_.begin() + row);
79 this->endRemoveRows();
83 for (QStandardItem *item : items)
100 for (Row &row : this->rows_)
102 for (QStandardItem *item : row.items)
109 int rowCount(
const QModelIndex &parent)
const override 113 return this->rows_.size();
120 return this->columnCount_;
123 QVariant
data(
const QModelIndex &index,
int role)
const override 125 int row = index.row(), column = index.column();
126 if (row < 0 || column < 0 || row >= this->rows_.size() ||
127 column >= this->columnCount_)
132 return rows_[row].items[column]->data(role);
135 bool setData(
const QModelIndex &index,
const QVariant &value,
138 int row = index.row(), column = index.column();
139 if (row < 0 || column < 0 || row >= this->rows_.size() ||
140 column >= this->columnCount_)
145 Row &rowItem = this->rows_[row];
147 assert(this->columnCount_ == rowItem.items.size());
149 auto &cell = rowItem.items[column];
151 cell->setData(value, role);
153 if (rowItem.isCustomRow)
159 int vecRow = this->getVectorIndexFromModelIndex(row);
160 this->vector_->
removeAt(vecRow,
this);
162 assert(this->rows_[row].original);
164 this->rows_[row].items, this->rows_[row].original.get());
165 this->vector_->
insert(item, vecRow,
this);
171 QVariant
headerData(
int section, Qt::Orientation orientation,
172 int role)
const override 174 if (orientation != Qt::Horizontal)
179 auto it = this->headerData_[section].find(role);
180 if (it == this->headerData_[section].end())
191 const QVariant &value,
192 int role = Qt::DisplayRole)
override 194 if (orientation != Qt::Horizontal)
199 this->headerData_[section][role] = value;
201 emit this->headerDataChanged(Qt::Horizontal, section, section);
205 Qt::ItemFlags
flags(
const QModelIndex &index)
const override 207 int row = index.row(), column = index.column();
209 if (row < 0 || column < 0 || row >= this->rows_.size() ||
210 column >= this->columnCount_)
212 return Qt::NoItemFlags;
215 assert(row >= 0 && row < this->rows_.size() && column >= 0 &&
216 column < this->columnCount_);
218 const auto &rowItem = this->rows_[row];
220 assert(this->columnCount_ == rowItem.items.size());
222 return rowItem.items[column]->flags();
227 assert(row >= 0 && row < this->rows_.size() && column >= 0 &&
228 column < this->columnCount_);
230 const auto &rowItem = this->rows_[row];
232 assert(this->columnCount_ == rowItem.items.size());
234 return rowItem.items[column];
239 int signalVectorRow = this->getVectorIndexFromModelIndex(row);
240 this->vector_->
removeAt(signalVectorRow);
243 bool moveRows(
const QModelIndex &sourceParent,
int sourceRow,
int count,
244 const QModelIndex &destinationParent,
245 int destinationChild)
override 252 assert(sourceRow >= 0 && sourceRow < this->rows_.size());
254 int signalVectorRow = this->getVectorIndexFromModelIndex(sourceRow);
255 this->beginMoveRows(sourceParent, sourceRow, sourceRow,
256 destinationParent, destinationChild);
260 this->rows_[sourceRow].original.get());
261 this->vector_->
removeAt(signalVectorRow);
263 item, this->getVectorIndexFromModelIndex(destinationChild));
270 bool removeRows(
int row,
int count,
const QModelIndex &parent)
override 279 assert(row >= 0 && row < this->rows_.size());
281 int signalVectorRow = this->getVectorIndexFromModelIndex(row);
282 this->vector_->
removeAt(signalVectorRow);
289 return {
"chatterino_row_id"};
292 QMimeData *
mimeData(
const QModelIndexList &list)
const override 294 if (list.length() == 1)
300 for (
auto &&x : list)
302 if (x.row() != list.first().row())
306 auto data =
new QMimeData;
307 data->setData(
"chatterino_row_id", QByteArray::number(list[0].row()));
312 int ,
const QModelIndex &parent)
override 314 if (data->hasFormat(
"chatterino_row_id") &&
315 action & (Qt::DropAction::MoveAction | Qt::DropAction::CopyAction))
317 int from = data->data(
"chatterino_row_id").toInt();
318 int to = parent.row();
320 int vectorFrom = this->getVectorIndexFromModelIndex(from);
321 int vectorTo = this->getVectorIndexFromModelIndex(to);
323 if (vectorFrom < 0 || vectorFrom > this->vector_->
raw().size() ||
324 vectorTo < 0 || vectorTo > this->vector_->
raw().size())
331 this->moveRow(this->index(from, to), from, parent, to);
345 : Qt::DropAction::CopyAction | Qt::DropAction::MoveAction;
354 virtual TVectorItem
getItemFromRow(std::vector<QStandardItem *> &row,
355 const TVectorItem &original) = 0;
359 std::vector<QStandardItem *> &row) = 0;
362 std::vector<QStandardItem *> &row,
365 (void)item, (
void)row;
367 return proposedIndex;
371 std::vector<QStandardItem *> &row,
int index)
373 (void)item, (
void)row, (void)index;
377 int column,
const QVariant &value,
int role,
380 (void)row, (
void)column, (void)value, (
void)role, (void)rowIndex;
385 assert(index >= 0 && index <= this->rows_.size());
387 this->beginInsertRows(QModelIndex(), index, index);
388 this->rows_.insert(this->rows_.begin() + index,
389 Row(std::move(row),
true));
390 this->endInsertRows();
395 assert(index >= 0 && index <= this->rows_.size());
396 assert(this->rows_[index].isCustomRow);
398 this->beginRemoveRows(QModelIndex(), index, index);
399 this->rows_.erase(this->rows_.begin() + index);
400 this->endRemoveRows();
405 std::vector<QStandardItem *> row;
406 for (
int i = 0; i < this->columnCount_; i++)
408 row.push_back(
new QStandardItem());
418 Row(std::vector<QStandardItem *> _items,
bool _isCustomRow =
false)
419 : items(
std::move(_items))
420 , isCustomRow(_isCustomRow)
424 Row(std::vector<QStandardItem *> _items,
const TVectorItem &_original,
425 bool _isCustomRow =
false)
426 : items(
std::move(_items))
427 , original(_original)
428 , isCustomRow(_isCustomRow)
433 const std::vector<Row> &
rows()
const 439 std::vector<QMap<int, QVariant>> headerData_;
441 std::vector<Row> rows_;
443 const int columnCount_;
446 int getVectorIndexFromModelIndex(
int index)
450 for (
auto &row : this->rows_)
474 for (
auto &row : this->
rows())
481 if (modelIndex == vectorIndex)
bool removeRows(int row, int count, const QModelIndex &parent) override
Definition: SignalVectorModel.hpp:270
boost::optional< TVectorItem > original
Definition: SignalVectorModel.hpp:415
QStandardItem * getItem(int row, int column)
Definition: SignalVectorModel.hpp:225
bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role=Qt::DisplayRole) override
Definition: SignalVectorModel.hpp:190
void initialize(SignalVector< TVectorItem > *vec)
Definition: SignalVectorModel.hpp:29
pajlada::Signals::Signal< SignalVectorItemEvent< T > > itemInserted
Definition: SignalVector.hpp:24
Definition: SeventvEventAPISubscription.hpp:67
virtual int beforeInsert(const TVectorItem &item, std::vector< QStandardItem *> &row, int proposedIndex)
Definition: SignalVectorModel.hpp:361
pajlada::Signals::Signal< SignalVectorItemEvent< T > > itemRemoved
Definition: SignalVector.hpp:25
bool setData(const QModelIndex &index, const QVariant &value, int role) override
Definition: SignalVectorModel.hpp:135
Definition: Application.cpp:48
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int, int, const QModelIndex &parent) override
Definition: SignalVectorModel.hpp:311
virtual TVectorItem getItemFromRow(std::vector< QStandardItem *> &row, const TVectorItem &original)=0
Qt::ItemFlags flags(const QModelIndex &index) const override
Definition: SignalVectorModel.hpp:205
void removeAt(int index, void *caller=nullptr)
Definition: SignalVector.hpp:110
const std::vector< Row > & rows() const
Definition: SignalVectorModel.hpp:433
SignalVectorModel(int columnCount, QObject *parent=nullptr)
Definition: SignalVectorModel.hpp:19
void deleteRow(int row)
Definition: SignalVectorModel.hpp:237
QStringList mimeTypes() const override
Definition: SignalVectorModel.hpp:287
void removeCustomRow(int index)
Definition: SignalVectorModel.hpp:393
Definition: SignalVectorModel.hpp:15
Qt::DropActions supportedDropActions() const override
Definition: SignalVectorModel.hpp:341
int getModelIndexFromVectorIndex(int vectorIndex) const
Definition: SignalVectorModel.hpp:470
const std::vector< T > & raw() const
Definition: SignalVector.hpp:124
virtual void getRowFromItem(const TVectorItem &item, std::vector< QStandardItem *> &row)=0
virtual void afterRemoved(const TVectorItem &item, std::vector< QStandardItem *> &row, int index)
Definition: SignalVectorModel.hpp:370
virtual ~SignalVectorModel()
Definition: SignalVectorModel.hpp:98
std::vector< QStandardItem * > items
Definition: SignalVectorModel.hpp:414
bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) override
Definition: SignalVectorModel.hpp:243
virtual void customRowSetData(const std::vector< QStandardItem *> &row, int column, const QVariant &value, int role, int rowIndex)
Definition: SignalVectorModel.hpp:376
Row(std::vector< QStandardItem *> _items, bool _isCustomRow=false)
Definition: SignalVectorModel.hpp:418
QVariant data(const QModelIndex &index, int role) const override
Definition: SignalVectorModel.hpp:123
void insertCustomRow(std::vector< QStandardItem *> row, int index)
Definition: SignalVectorModel.hpp:383
Definition: SignalVectorModel.hpp:413
SignalVectorModel< TVectorItem > * initialized(SignalVector< TVectorItem > *vec)
Definition: SignalVectorModel.hpp:92
QMimeData * mimeData(const QModelIndexList &list) const override
Definition: SignalVectorModel.hpp:292
int rowCount(const QModelIndex &parent) const override
Definition: SignalVectorModel.hpp:109
std::vector< QStandardItem * > createRow()
Definition: SignalVectorModel.hpp:403
virtual void afterInit()
Definition: SignalVectorModel.hpp:349
Definition: SignalVector.hpp:14
int columnCount(const QModelIndex &parent) const override
Definition: SignalVectorModel.hpp:116
QVariant headerData(int section, Qt::Orientation orientation, int role) const override
Definition: SignalVectorModel.hpp:171
Row(std::vector< QStandardItem *> _items, const TVectorItem &_original, bool _isCustomRow=false)
Definition: SignalVectorModel.hpp:424
bool isSorted() const
Definition: SignalVector.hpp:44
bool isCustomRow
Definition: SignalVectorModel.hpp:416
int insert(const T &item, int index=-1, void *caller=nullptr)
Definition: SignalVector.hpp:65