9 #include <QFontDatabase> 13 #include <QKeySequence> 25 return doj::alphanum_impl(this->text(0).toLocal8Bit(), other.text(0).toLocal8Bit()) <
34 setEditTriggers(NoEditTriggers);
35 setDragEnabled(
false);
36 setDefaultDropAction(Qt::IgnoreAction);
37 setDragDropOverwriteMode(
false);
38 setMouseTracking(
true);
39 setDragDropMode(NoDragDrop);
40 viewport()->installEventFilter(
this);
41 setSelectionMode(ExtendedSelection);
42 setSelectionBehavior(QAbstractItemView::SelectRows);
43 setFocusPolicy(Qt::ClickFocus);
45 header()->setVisible(
false);
46 header()->setStretchLastSection(
true);
47 header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
48 setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
50 connect(
this, &QTreeWidget::itemDoubleClicked,
this,
51 [
this](QTreeWidgetItem* item,
int column) {
58 connect(selectionModel(), &QItemSelectionModel::selectionChanged,
this, [
this]() {
63 setFocusPolicy(Qt::NoFocus);
68 setFocusPolicy(Qt::ClickFocus);
74 const QString& plot_ID)
83 bool use_separator = settings.value(
"Preferences::use_separator",
true).toBool();
88 parts = tree_name.split(
'/', QString::SplitBehavior::SkipEmptyParts);
92 parts.push_back(tree_name);
95 if (parts.size() == 0)
100 bool prefix_is_group = tree_name.startsWith(group_name);
101 bool hasGroup = !group_name.isEmpty();
102 auto group_parts = group_name.split(
'/', QString::SplitBehavior::SkipEmptyParts);
104 if (hasGroup && !prefix_is_group)
106 parts = group_parts + parts;
109 QTreeWidgetItem* tree_parent = this->invisibleRootItem();
111 for (
int i = 0; i < parts.size(); i++)
113 bool is_leaf = (i == parts.size() - 1);
114 const auto& part = parts[i];
116 QTreeWidgetItem* matching_child =
nullptr;
118 for (
int c = 0; c < tree_parent->childCount(); c++)
120 QTreeWidgetItem* tree_child = tree_parent->child(c);
121 if (tree_child->text(0) == part)
123 matching_child = tree_child;
130 tree_parent = matching_child;
135 child_item->setText(0, part);
136 child_item->setText(1, is_leaf ?
"-" :
"");
138 bool isGroupCell = (i < group_parts.size());
140 QFont font = QFontDatabase::systemFont(QFontDatabase::GeneralFont);
143 child_item->setFont(0, font);
145 font = QFontDatabase::systemFont(QFontDatabase::FixedFont);
147 child_item->setFont(1, font);
148 child_item->setTextAlignment(1, Qt::AlignRight);
150 tree_parent = child_item;
152 auto current_flag = child_item->flags();
156 child_item->setData(0,
Name, group_name);
157 child_item->setData(0,
IsGroupName, (i + 1) == group_parts.size());
162 child_item->setFlags(current_flag | Qt::ItemIsSelectable);
163 child_item->setData(0,
Name, plot_ID);
167 child_item->setFlags(current_flag & (~Qt::ItemIsSelectable));
176 invisibleRootItem()->sortChildren(0, Qt::AscendingOrder);
177 treeVisitor([&](QTreeWidgetItem* item) { item->sortChildren(0, Qt::AscendingOrder); });
178 header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
184 std::vector<std::string> non_hidden_list;
186 for (
const auto& item : selectedItems())
188 non_hidden_list.push_back(item->data(0, Qt::UserRole).toString().toStdString());
190 return non_hidden_list;
195 header()->setSectionResizeMode(0, QHeaderView::Fixed);
196 header()->setSectionResizeMode(1, QHeaderView::Fixed);
199 auto font = item->font(0);
201 item->setFont(0, font);
202 font = item->font(1);
204 item->setFont(1, font);
207 header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
208 header()->setSectionResizeMode(1, QHeaderView::Stretch);
213 bool updated =
false;
216 QStringList spaced_items = search_string.split(
' ', QString::SkipEmptyParts);
218 auto hideFunc = [&](QTreeWidgetItem* item) {
219 QString
name = item->data(0, Qt::UserRole).toString();
226 if (search_string.isEmpty() ==
false)
228 for (
const auto& spaced_item : spaced_items)
230 if (name.contains(spaced_item, Qt::CaseInsensitive) ==
false)
242 if (toHide != item->isHidden())
247 item->setHidden(toHide);
250 auto parent = item->parent();
253 bool all_children_hidden =
true;
254 for (
int c = 0; c < parent->childCount(); c++)
256 if (!parent->child(c)->isHidden())
258 all_children_hidden =
false;
262 auto parent_hidden = parent->isHidden();
263 if (all_children_hidden != parent_hidden)
265 parent->setHidden(all_children_hidden);
266 parent = parent->parent();
283 if (event->type() == QEvent::MouseMove)
285 auto mouse_event =
static_cast<QMouseEvent*
>(event);
286 auto* item = itemAt(mouse_event->pos());
290 if (tooltip.isValid())
292 QToolTip::showText(mapToGlobal(mouse_event->pos()), tooltip.toString());
296 QToolTip::hideText();
304 return QWidget::eventFilter(
object, event);
314 auto removeFunc = [&](QTreeWidgetItem* item) {
315 QString curve_name = item->data(0, Qt::UserRole).toString();
316 if (curve_name == to_be_deleted)
319 auto parent_item = item->parent();
322 parent_item = invisibleRootItem();
324 parent_item->removeChild(item);
326 while (parent_item->childCount() == 0 && parent_item != invisibleRootItem())
328 auto prev_item = parent_item;
329 parent_item = parent_item->parent();
332 parent_item = invisibleRootItem();
334 parent_item->removeChild(prev_item);
345 setColumnHidden(1, hide);
350 std::function<void(QTreeWidgetItem*)> recursiveFunction;
351 recursiveFunction = [&](QTreeWidgetItem* item) {
353 for (
int c = 0; c < item->childCount(); c++)
355 recursiveFunction(item->child(c));
359 for (
int c = 0; c < invisibleRootItem()->childCount(); c++)
361 recursiveFunction(invisibleRootItem()->child(c));
367 if (event->matches(QKeySequence::Copy))
369 auto selected = selectedItems();
370 if (selected.size() > 0)
372 QClipboard* clipboard = QApplication::clipboard();
373 clipboard->setText(selected.front()->data(0,
Name).toString());
380 int childCount = item->childCount();
381 for (
int i = 0; i < childCount; i++)
383 const auto child = item->child(i);
385 if (child->childCount() > 0)
387 child->setExpanded(expanded);
std::vector< std::string > getSelectedNames() override
void expandChildren(bool expanded, QTreeWidgetItem *item)
void removeCurve(const QString &name) override
void treeVisitor(std::function< void(QTreeWidgetItem *)> visitor)
void addItem(const QString &prefix, const QString &tree_name, const QString &plot_ID) override
virtual void keyPressEvent(QKeyEvent *) override
bool eventFilter(QObject *object, QEvent *event) override
void refreshColumns() override
void refreshFontSize() override
CurveTreeView(CurveListPanel *parent)
void setViewResizeEnabled(bool) override
bool applyVisibilityFilter(const QString &filter_string) override
bool eventFilterBase(QObject *object, QEvent *event)
virtual void hideValuesColumn(bool hide) override