12#include <QItemSelectionRange>
42 for (
int i = 0, size =
c.size ();
i < size; ++
i)
43 if (
c.at (
i).get () ==
this)
56 : QAbstractItemModel { parent }
65 SourceModel_->columnCount ({}) :
85 if (
fti->Tag_.isEmpty ())
86 return tr (
"untagged");
89 return ut.isEmpty () ?
tr (
"<unknown tag>") :
ut;
113 return fti->Index_.flags ();
115 return Qt::ItemIsSelectable |
117 Qt::ItemIsDragEnabled |
118 Qt::ItemIsDropEnabled;
143 return ToFlatOrRoot (
index).
C_.size ();
148 return SourceModel_ ?
149 SourceModel_->supportedDropActions () :
150 QAbstractItemModel::supportedDropActions ();
155 return SourceModel_ ?
156 SourceModel_->mimeTypes () :
157 QAbstractItemModel::mimeTypes ();
163 return QAbstractItemModel::mimeData (
indexes);
217 SourceModel_ =
model;
224 &QAbstractItemModel::headerDataChanged,
226 &QAbstractItemModel::headerDataChanged);
228 &QAbstractItemModel::dataChanged,
230 &FlatToFoldersProxyModel::HandleDataChanged);
232 &QAbstractItemModel::layoutAboutToBeChanged,
234 &QAbstractItemModel::layoutAboutToBeChanged);
236 &QAbstractItemModel::layoutChanged,
238 &QAbstractItemModel::layoutChanged);
240 &QAbstractItemModel::modelReset,
242 &FlatToFoldersProxyModel::HandleModelReset);
244 &QAbstractItemModel::rowsInserted,
246 &FlatToFoldersProxyModel::HandleRowsInserted);
248 &QAbstractItemModel::rowsAboutToBeRemoved,
250 &FlatToFoldersProxyModel::HandleRowsAboutToBeRemoved);
266 if (!
proxy.isValid ())
290 <<
"could not find folder for tag"
298 for (
int i = 0;
i <
folder->C_.size (); ++
i)
313 for (
const auto&
item : Root_->C_)
323 for (
const auto&
item :
c)
327 const auto&
item = std::make_shared<FlatTreeItem> ();
330 item->Parent_ = Root_;
332 int size =
c.size ();
340 const FlatTreeItem& FlatToFoldersProxyModel::ToFlatOrRoot (
const QModelIndex&
idx)
const
345 void FlatToFoldersProxyModel::HandleRowInserted (
int i)
347 const auto&
idx = SourceModel_->index (
i, 0);
360 void FlatToFoldersProxyModel::HandleRowRemoved (
int i)
362 QAbstractItemModel *
model = SourceModel_;
376 void FlatToFoldersProxyModel::AddForTag (
const QString&
tag,
381 const auto&
item = std::make_shared<FlatTreeItem> ();
387 int size =
folder->C_.size ();
395 void FlatToFoldersProxyModel::RemoveFromTag (
const QString&
tag,
401 for (
int i = 0, size =
c.size ();
404 if (
c.at (
i)->Index_ !=
pidx)
408 Items_.remove (
pidx,
c.at (
i));
417 Root_->C_.removeAt (
findex);
422 void FlatToFoldersProxyModel::HandleChanged (
const QModelIndex&
idx)
443 for (
int i = 0, size =
c.size ();
446 if (
c.at (
i)->Index_ !=
pidx)
470 HandleChanged (
index);
473 void FlatToFoldersProxyModel::HandleModelReset ()
475 if (
const int size = Root_->C_.size ())
484 for (
int i = 0, size = SourceModel_->rowCount ();
i < size; ++
i)
485 HandleRowInserted (
i);
488 void FlatToFoldersProxyModel::HandleRowsInserted (
const QModelIndex&,
int start,
int end)
491 HandleRowInserted (
i);
494 void FlatToFoldersProxyModel::HandleRowsAboutToBeRemoved (
const QModelIndex&,
int start,
int end)
497 HandleRowRemoved (
i);
QVariant headerData(int, Qt::Orientation, int) const override
Qt::DropActions supportedDropActions() const override
int rowCount(const QModelIndex &={}) const override
QAbstractItemModel * GetSourceModel() const
void SetSourceModel(QAbstractItemModel *)
FlatToFoldersProxyModel(const ITagsManager *, QObject *=nullptr)
QModelIndex parent(const QModelIndex &) const override
QMimeData * mimeData(const QModelIndexList &indexes) const override
QList< QModelIndex > MapFromSource(const QModelIndex &) const
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
int columnCount(const QModelIndex &={}) const override
QVariant data(const QModelIndex &, int=Qt::DisplayRole) const override
QModelIndex MapToSource(const QModelIndex &) const
QModelIndex index(int, int, const QModelIndex &={}) const override
Qt::ItemFlags flags(const QModelIndex &) const override
QStringList mimeTypes() const override
std::shared_ptr< FlatTreeItem > FlatTreeItem_ptr
Container< T > Filter(const Container< T > &c, F f)
auto AsSet(const T &cont)
FlatTreeItem * ToFlat(const QModelIndex &idx)
QPersistentModelIndex Index_
QList< FlatTreeItem_ptr > C_