curvetree_view.cpp
Go to the documentation of this file.
1 #include "curvetree_view.h"
2 #include "curvelist_panel.h"
3 #include <QFontDatabase>
4 #include <QObject>
5 
6 class TreeWidgetItem : public QTreeWidgetItem
7 {
8 public:
9  TreeWidgetItem(QTreeWidgetItem* parent) : QTreeWidgetItem(parent)
10  {
11  }
12 
13  bool operator<(const QTreeWidgetItem& other) const
14  {
15  return doj::alphanum_impl(this->text(0).toLocal8Bit(), other.text(0).toLocal8Bit()) < 0;
16  }
17 };
18 
19 CurveTreeView::CurveTreeView(CurveListPanel* parent) : QTreeWidget(parent), CurvesView(parent)
20 {
21  setColumnCount(2);
22  setEditTriggers(NoEditTriggers);
23  setDragEnabled(false);
24  setDefaultDropAction(Qt::IgnoreAction);
25  setDragDropOverwriteMode(false);
26  setDragDropMode(NoDragDrop);
27  viewport()->installEventFilter(this);
28  setSelectionMode(ExtendedSelection);
29  setSelectionBehavior(QAbstractItemView::SelectRows);
30  setFocusPolicy(Qt::ClickFocus);
31 
32  header()->setVisible(false);
33  header()->setStretchLastSection(true);
34  header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
35  setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
36 
37  connect(this, &QTreeWidget::itemDoubleClicked, this, [this](QTreeWidgetItem *item, int column)
38  {
39  if( column == 0){
40  expandChildren(item);
41  }
42  });
43 
44  connect(selectionModel(), &QItemSelectionModel::selectionChanged, this, [this]()
45  {
46  if (getSelectedNames().empty())
47  {
48  // this looks nicer
49  clearFocus();
50  setFocusPolicy(Qt::NoFocus);
51  }
52  else {
53  // this focus policy is needed to allow CurveListPanel::keyPressEvent to be called
54  setFocusPolicy(Qt::ClickFocus);
55  }
56  });
57 }
58 
59 void CurveTreeView::addItem(const QString& item_name)
60 {
61  auto parts = item_name.split('/', QString::SplitBehavior::SkipEmptyParts);
62  if (parts.size() == 0)
63  {
64  return;
65  }
66 
67  QTreeWidgetItem* tree_parent = this->invisibleRootItem();
68 
69  for (int i = 0; i < parts.size(); i++)
70  {
71  bool is_leaf = (i == parts.size() - 1);
72  const auto& part = parts[i];
73 
74  QTreeWidgetItem* matching_child = nullptr;
75 
76  for (int c = 0; c < tree_parent->childCount(); c++)
77  {
78  QTreeWidgetItem* tree_child = tree_parent->child(c);
79  if (tree_child->text(0) == part)
80  {
81  matching_child = tree_child;
82  break;
83  }
84  }
85 
86  if (matching_child)
87  {
88  tree_parent = matching_child;
89  }
90  else
91  {
92  QTreeWidgetItem* child_item = new TreeWidgetItem(tree_parent);
93  child_item->setText(0, part);
94  child_item->setText(1, is_leaf ? "-" : "");
95 
96  QFont font = QFontDatabase::systemFont(QFontDatabase::GeneralFont);
97  font.setPointSize(_point_size);
98  child_item->setFont(0, font);
99 
100  font = QFontDatabase::systemFont(QFontDatabase::FixedFont);
101  font.setPointSize(_point_size - 2);
102  child_item->setFont(1, font);
103  child_item->setTextAlignment(1, Qt::AlignRight);
104 
105 
106  tree_parent = child_item;
107 
108  auto current_flag = child_item->flags();
109 
110  if (is_leaf)
111  {
112  child_item->setFlags(current_flag | Qt::ItemIsSelectable);
113  child_item->setData(0, Qt::UserRole, item_name);
114  }
115  else
116  {
117  child_item->setFlags(current_flag & (~Qt::ItemIsSelectable));
118  }
119  }
120  }
121  _leaf_count++;
122 }
123 
125 {
126  invisibleRootItem()->sortChildren(0, Qt::AscendingOrder);
127  treeVisitor([&](QTreeWidgetItem* item) { item->sortChildren(0, Qt::AscendingOrder); });
128  header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
129  // TODO emit updateFilter();
130 }
131 
132 std::vector<std::string> CurveTreeView::getSelectedNames()
133 {
134  std::vector<std::string> non_hidden_list;
135 
136  for (const auto& item : selectedItems())
137  {
138  non_hidden_list.push_back(item->data(0, Qt::UserRole).toString().toStdString());
139  }
140  return non_hidden_list;
141 }
142 
144 {
145  header()->setSectionResizeMode(0, QHeaderView::Fixed);
146  header()->setSectionResizeMode(1, QHeaderView::Fixed);
147 
148  treeVisitor([this](QTreeWidgetItem* item) {
149  auto font = item->font(0);
150  font.setPointSize(_point_size);
151  item->setFont(0, font);
152  font = item->font(1);
153  font.setPointSize(_point_size - 2);
154  item->setFont(1, font);
155  });
156 
157  header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
158  header()->setSectionResizeMode(1, QHeaderView::Stretch);
159 }
160 
161 bool CurveTreeView::applyVisibilityFilter(const QString& search_string)
162 {
163  bool updated = false;
164  _hidden_count = 0;
165 
166  QStringList spaced_items = search_string.split(' ');
167 
168  auto hideFunc = [&](QTreeWidgetItem* item) {
169  QString name = item->data(0, Qt::UserRole).toString();
170  if (name.isEmpty())
171  {
172  return; // not a leaf
173  }
174  bool toHide = false;
175 
176  if (search_string.isEmpty() == false)
177  {
178  for (const auto& spaced_item : spaced_items)
179  {
180  if (name.contains(spaced_item, Qt::CaseInsensitive) == false)
181  {
182  toHide = true;
183  break;
184  }
185  }
186  }
187  if (toHide)
188  {
189  _hidden_count++;
190  }
191 
192  if (toHide != item->isHidden())
193  {
194  updated = true;
195  }
196 
197  item->setHidden(toHide);
198 
199  // hide the parent if necessary
200  auto parent = item->parent();
201  while (parent)
202  {
203  bool all_children_hidden = true;
204  for (int c = 0; c < parent->childCount(); c++)
205  {
206  if (!parent->child(c)->isHidden())
207  {
208  all_children_hidden = false;
209  break;
210  }
211  }
212  auto parent_hidden = parent->isHidden();
213  if (all_children_hidden != parent_hidden)
214  {
215  parent->setHidden(all_children_hidden);
216  parent = parent->parent();
217  }
218  else
219  {
220  break;
221  }
222  }
223  };
224 
225  treeVisitor(hideFunc);
226  //-------------
227 
228  return updated;
229 }
230 
231 void CurveTreeView::removeCurve(const QString& to_be_deleted)
232 {
233  auto removeFunc = [&](QTreeWidgetItem* item) {
234  QString curve_name = item->data(0, Qt::UserRole).toString();
235  if (curve_name == to_be_deleted)
236  {
237  _leaf_count--;
238  auto parent_item = item->parent();
239  if (!parent_item)
240  {
241  parent_item = invisibleRootItem();
242  }
243  parent_item->removeChild(item);
244 
245  while (parent_item->childCount() == 0 && parent_item != invisibleRootItem())
246  {
247  auto prev_item = parent_item;
248  parent_item = parent_item->parent();
249  if (!parent_item)
250  {
251  parent_item = invisibleRootItem();
252  }
253  parent_item->removeChild(prev_item);
254  }
255  }
256  };
257 
258  treeVisitor(removeFunc);
259 }
260 
262 {
263  setViewResizeEnabled(true);
264  setColumnHidden(1,hide);
265 }
266 
267 void CurveTreeView::treeVisitor(std::function<void(QTreeWidgetItem*)> visitor)
268 {
269  std::function<void(QTreeWidgetItem*)> recursiveFunction;
270  recursiveFunction = [&](QTreeWidgetItem* item) {
271  visitor(item);
272  for (int c = 0; c < item->childCount(); c++)
273  {
274  recursiveFunction(item->child(c));
275  }
276  };
277 
278  for (int c = 0; c < invisibleRootItem()->childCount(); c++)
279  {
280  recursiveFunction(invisibleRootItem()->child(c));
281  }
282 }
283 
284 void CurveTreeView::expandChildren(QTreeWidgetItem *item)
285 {
286  int childCount = item->childCount();
287  for (int i = 0; i < childCount; i++) {
288  const auto child = item->child(i);
289  // Recursively call the function for each child node.
290  if( !child->isExpanded() && child->childCount() > 0 ){
291  child->setExpanded(true);
292  expandChildren(child);
293  }
294  }
295 }
void expandChildren(QTreeWidgetItem *item)
std::vector< std::string > getSelectedNames() override
void removeCurve(const QString &name) override
void addItem(const QString &item_name) override
void treeVisitor(std::function< void(QTreeWidgetItem *)> visitor)
bool operator<(const QTreeWidgetItem &other) const
TreeWidgetItem(QTreeWidgetItem *parent)
void refreshColumns() override
const char * name
void refreshFontSize() override
MQTTClient c
Definition: test10.c:1656
CurveTreeView(CurveListPanel *parent)
void setViewResizeEnabled(bool) override
bool applyVisibilityFilter(const QString &filter_string) override
virtual void hideValuesColumn(bool hide) override


plotjuggler
Author(s): Davide Faconti
autogenerated on Sun Dec 6 2020 03:47:33