LeechCraft  0.6.70-18450-gabe19ee3b0
Modular cross-platform feature rich live environment.
flattofoldersproxymodel.h
Go to the documentation of this file.
1 /**********************************************************************
2  * LeechCraft - modular cross-platform feature rich internet client.
3  * Copyright (C) 2006-2014 Georg Rudoy
4  *
5  * Distributed under the Boost Software License, Version 1.0.
6  * (See accompanying file LICENSE or copy at https://www.boost.org/LICENSE_1_0.txt)
7  **********************************************************************/
8 
9 #pragma once
10 
11 #include <memory>
12 #include <QAbstractItemModel>
13 #include <QStringList>
14 #include <QMultiHash>
15 #include "modelsconfig.h"
16 
17 class ITagsManager;
18 
19 namespace LC::Util
20 {
21  struct FlatTreeItem;
22  using FlatTreeItem_ptr = std::shared_ptr<FlatTreeItem>;
23 
24  class UTIL_MODELS_API FlatToFoldersProxyModel : public QAbstractItemModel
25  {
26  QAbstractItemModel *SourceModel_ = nullptr;
27 
28  const ITagsManager * const TM_;
29 
30  FlatTreeItem_ptr Root_;
31  QMultiHash<QPersistentModelIndex, FlatTreeItem_ptr> Items_;
32  public:
33  explicit FlatToFoldersProxyModel (const ITagsManager*, QObject* = nullptr);
34 
35  int columnCount (const QModelIndex& = {}) const override;
36  QVariant data (const QModelIndex&, int = Qt::DisplayRole) const override;
37  QVariant headerData (int, Qt::Orientation, int) const override;
38  Qt::ItemFlags flags (const QModelIndex&) const override;
39  QModelIndex index (int, int, const QModelIndex& = {}) const override;
40  QModelIndex parent (const QModelIndex&) const override;
41  int rowCount (const QModelIndex& = {}) const override;
42 
43  Qt::DropActions supportedDropActions () const override;
44  QStringList mimeTypes () const override;
45  QMimeData* mimeData (const QModelIndexList& indexes) const override;
46  bool dropMimeData (const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex& parent) override;
47 
48  void SetSourceModel (QAbstractItemModel*);
49  QAbstractItemModel* GetSourceModel () const;
50  QModelIndex MapToSource (const QModelIndex&) const;
51  QList<QModelIndex> MapFromSource (const QModelIndex&) const;
52 
53  bool IsFolder (const QModelIndex&) const;
54  QList<QModelIndex> GetChildren (const QModelIndex&) const;
55  QList<QVariant> GetChildrenData (const QModelIndex& index, int role) const;
56 
57  template<typename T>
58  QList<T> GetChildrenData (const QModelIndex& index, int role) const
59  {
60  QList<T> result;
61  for (const auto& var : GetChildrenData (index, role))
62  result.push_back (var.value<T> ());
63  return result;
64  }
65  private:
66  const FlatTreeItem& ToFlatOrRoot (const QModelIndex&) const;
67 
68  void HandleRowInserted (int);
69  void HandleRowRemoved (int);
70  void AddForTag (const QString&, const QPersistentModelIndex&);
71  void RemoveFromTag (const QString&, const QPersistentModelIndex&);
72  void HandleChanged (const QModelIndex&);
73 
74  FlatTreeItem_ptr FindFolder (const QString&) const;
75  FlatTreeItem_ptr GetFolder (const QString&);
76 
77  void HandleDataChanged (const QModelIndex&, const QModelIndex&);
78  void HandleModelReset ();
79  void HandleRowsInserted (const QModelIndex&, int, int);
80  void HandleRowsAboutToBeRemoved (const QModelIndex&, int, int);
81  };
82 }
QMultiMap< QDateTime, QString > Items_
Tags manager&#39;s interface.
Definition: itagsmanager.h:22
QList< T > GetChildrenData(const QModelIndex &index, int role) const
std::shared_ptr< FlatTreeItem > FlatTreeItem_ptr
#define UTIL_MODELS_API
Definition: modelsconfig.h:16