tree_completer.h
Go to the documentation of this file.
1 #ifndef TREE_COMPLETER_H
2 #define TREE_COMPLETER_H
3 
4 #include <QString>
5 #include <QHash>
6 #include <QVariant>
7 #include <QList>
8 #include <QStandardItem>
9 #include <QStandardItemModel>
10 #include <QCompleter>
11 
12 class TreeItem
13 {
14 public:
15  explicit TreeItem(QStandardItem* item): _item(item)
16  {
17 
18  }
19 
20  TreeItem* appendChild(const QString& name, QStandardItem* item)
21  {
22  return &(_child_items_map.insert(name, TreeItem(item) ).value());
23  }
24 
25  TreeItem * findChild(const QString& name)
26  {
27  auto it = _child_items_map.find(name);
28  if( it == _child_items_map.end())
29  {
30  return nullptr;
31  }
32  return &(it.value());
33  }
34 
35  QStandardItem* standardItem() { return _item; }
36 
37 private:
38  QHash<QString, TreeItem> _child_items_map;
39  QStandardItem* _item;
40 };
41 
42 class TreeModelCompleter : public QCompleter
43 {
44 
45 public:
46  TreeModelCompleter(QObject *parent = 0):
47  QCompleter(parent),
48  _model(new QStandardItemModel()),
49  _root_tree_item(nullptr)
50  {
51  setModelSorting( QCompleter::CaseInsensitivelySortedModel );
52  setModel(_model);
53  _root_tree_item = TreeItem(_model->invisibleRootItem());
54  }
55 
56  void clear()
57  {
58  _model->clear();
59  _root_tree_item = TreeItem(_model->invisibleRootItem());
60  }
61 
62  QStringList splitPath(const QString &path) const override {
63  return path.split('/');
64  }
65 
66  QString pathFromIndex(const QModelIndex &index) const override
67  {
68  QStringList dataList;
69  for (QModelIndex it = index; it.isValid(); it = it.parent())
70  {
71  dataList.prepend(model()->data(it, completionRole()).toString());
72  }
73  return dataList.join('/');
74  }
75 
76  void addToCompletionTree(const QString &name)
77  {
78  auto parts = name.split('/');
79  if( parts.size() == 0 )
80  {
81  return;
82  }
83 
84  TreeItem* tree_parent = & _root_tree_item;
85  QStandardItem *item_parent = tree_parent->standardItem();
86 
87  for (const auto& part: parts)
88  {
89  TreeItem* matching_child = tree_parent->findChild( part );
90  if(matching_child)
91  {
92  tree_parent = matching_child;
93  item_parent = matching_child->standardItem();
94  }
95  else
96  {
97  QStandardItem* item = new QStandardItem( part );
98  item_parent->appendRow(item);
99  tree_parent = tree_parent->appendChild(part, item);
100  item_parent = item;
101  }
102  }
103  }
104 
105 private:
106 
107  QStandardItemModel* _model;
109 };
110 
111 
112 #endif // TREE_COMPLETER_H
TreeItem * appendChild(const QString &name, QStandardItem *item)
QStandardItem * _item
TreeModelCompleter(QObject *parent=0)
void addToCompletionTree(const QString &name)
TreeItem(QStandardItem *item)
QHash< QString, TreeItem > _child_items_map
TreeItem * findChild(const QString &name)
QStandardItem * standardItem()
QString pathFromIndex(const QModelIndex &index) const override
QStringList splitPath(const QString &path) const override
empty_struct data[sizeof(T)/sizeof(empty_struct)]
QStandardItemModel * _model


plotjuggler
Author(s): Davide Faconti
autogenerated on Sat Jul 6 2019 03:44:18