diff --git a/app/mon/mon_gui/src/widgets/ecalmon_tree_widget/topic_widget.cpp b/app/mon/mon_gui/src/widgets/ecalmon_tree_widget/topic_widget.cpp index 6be222f180..8071e448b6 100644 --- a/app/mon/mon_gui/src/widgets/ecalmon_tree_widget/topic_widget.cpp +++ b/app/mon/mon_gui/src/widgets/ecalmon_tree_widget/topic_widget.cpp @@ -275,7 +275,6 @@ void TopicWidget::autoSizeColumns() ui_.tree_view->resizeColumnToContents(column); } - topic_tree_model_->removeItem(example_topic_item); topic_tree_model_->removeItem(example_group_item); diff --git a/app/mon/mon_gui/src/widgets/models/group_tree_model.cpp b/app/mon/mon_gui/src/widgets/models/group_tree_model.cpp index 0c2bfaca28..8efe93fa16 100644 --- a/app/mon/mon_gui/src/widgets/models/group_tree_model.cpp +++ b/app/mon/mon_gui/src/widgets/models/group_tree_model.cpp @@ -139,7 +139,7 @@ void GroupTreeModel::insertItemIntoGroups(QAbstractTreeItem* item) QVariant current_group_name = item->data(mapColumnToItem(group_by_columns_[0], item->type()), Qt::ItemDataRole::DisplayRole); QVariant current_group_filter_role = item->data(mapColumnToItem(group_by_columns_[0], item->type()), (Qt::ItemDataRole)ItemDataRoles::FilterRole); //-V1016 QVariant current_group_sort_role = item->data(mapColumnToItem(group_by_columns_[0], item->type()), (Qt::ItemDataRole)ItemDataRoles::SortRole); //-V1016 - QVariant current_group_font_role = item->data(mapColumnToItem(group_by_columns_[0], item->type()), Qt::ItemDataRole::FontRole); + QVariant current_group_font_role = standardFont; QVariant current_group_identifier = item->data(mapColumnToItem(group_by_columns_[0], item->type()), (Qt::ItemDataRole)ItemDataRoles::GroupRole); //-V1016 @@ -175,7 +175,7 @@ void GroupTreeModel::insertItemIntoGroups(QAbstractTreeItem* item) current_group_name = item->data(remaining_sub_groups.front(), Qt::ItemDataRole::DisplayRole); current_group_filter_role = item->data(remaining_sub_groups.front(), (Qt::ItemDataRole)ItemDataRoles::FilterRole); //-V1016 current_group_sort_role = item->data(remaining_sub_groups.front(), (Qt::ItemDataRole)ItemDataRoles::SortRole); //-V1016 - current_group_font_role = item->data(remaining_sub_groups.front(), Qt::ItemDataRole::FontRole); + current_group_font_role = standardFont; current_group_identifier = item->data(remaining_sub_groups.front(), (Qt::ItemDataRole)ItemDataRoles::GroupRole); //-V1016 auto subgroup_list = group_item->findChildren( diff --git a/app/mon/mon_gui/src/widgets/models/group_tree_model.h b/app/mon/mon_gui/src/widgets/models/group_tree_model.h index f42f96b133..07245a577f 100644 --- a/app/mon/mon_gui/src/widgets/models/group_tree_model.h +++ b/app/mon/mon_gui/src/widgets/models/group_tree_model.h @@ -35,6 +35,7 @@ #include #include #include +#include class GroupTreeModel : public QAbstractTreeModel { @@ -102,4 +103,6 @@ class GroupTreeModel : public QAbstractTreeModel QVariant group_column_header_; QVector group_by_columns_; + + QFont standardFont; }; diff --git a/app/mon/mon_gui/src/widgets/models/topic_tree_item.cpp b/app/mon/mon_gui/src/widgets/models/topic_tree_item.cpp index 007491c57f..c9d6a0062b 100644 --- a/app/mon/mon_gui/src/widgets/models/topic_tree_item.cpp +++ b/app/mon/mon_gui/src/widgets/models/topic_tree_item.cpp @@ -19,7 +19,6 @@ #include "topic_tree_item.h" -#include #include #include #include @@ -42,6 +41,7 @@ QVariant TopicTreeItem::data(int column, Qt::ItemDataRole role) const QVariant TopicTreeItem::data(Columns column, Qt::ItemDataRole role) const { + if (role == (Qt::ItemDataRole)ItemDataRoles::RawDataRole) //-V1016 //-V547 { if (column == Columns::REGISTRATION_CLOCK) @@ -312,6 +312,7 @@ QVariant TopicTreeItem::data(Columns column, Qt::ItemDataRole role) const { QFont font; font.setItalic(true); + font.setBold(itemfont.bold()); return font; } } @@ -322,16 +323,23 @@ QVariant TopicTreeItem::data(Columns column, Qt::ItemDataRole role) const { QFont font; font.setItalic(true); + font.setBold(itemfont.bold()); return font; } } - return QVariant(); // Invalid QVariant + return itemfont; } return QVariant(); // Invalid QVariant } +bool TopicTreeItem::setFont(const QFont& font) +{ + itemfont = font; + return false; +} + int TopicTreeItem::type() const { return (int)TreeItemType::Topic; diff --git a/app/mon/mon_gui/src/widgets/models/topic_tree_item.h b/app/mon/mon_gui/src/widgets/models/topic_tree_item.h index 2320403573..f49f4a2620 100644 --- a/app/mon/mon_gui/src/widgets/models/topic_tree_item.h +++ b/app/mon/mon_gui/src/widgets/models/topic_tree_item.h @@ -20,6 +20,7 @@ #pragma once #include "CustomQt/QAbstractTreeItem.h" +#include #ifdef _MSC_VER #pragma warning(push) @@ -67,6 +68,8 @@ class TopicTreeItem : QVariant data(Columns column, Qt::ItemDataRole role = Qt::ItemDataRole::DisplayRole) const; + bool setFont(const QFont& font); + int type() const; void update(const eCAL::pb::Topic& topic); @@ -77,7 +80,6 @@ class TopicTreeItem : private: eCAL::pb::Topic topic_; - + QFont itemfont; static QString toFrequencyString(long long freq); }; - diff --git a/app/mon/mon_gui/src/widgets/models/topic_tree_model.cpp b/app/mon/mon_gui/src/widgets/models/topic_tree_model.cpp index 4f63fe37cb..723a7f2875 100644 --- a/app/mon/mon_gui/src/widgets/models/topic_tree_model.cpp +++ b/app/mon/mon_gui/src/widgets/models/topic_tree_model.cpp @@ -17,6 +17,9 @@ * ========================= eCAL LICENSE ================================= */ +#include +#include + #include "topic_tree_model.h" #include "tree_item_type.h" #include "item_data_roles.h" @@ -49,7 +52,6 @@ QVariant TopicTreeModel::headerData(int section, Qt::Orientation orientation, in return QAbstractTreeModel::headerData(section, orientation, role); } - int TopicTreeModel::mapColumnToItem(int model_column, int tree_item_type) const { switch ((TreeItemType)tree_item_type) @@ -70,7 +72,7 @@ void TopicTreeModel::monitorUpdated(const eCAL::pb::Monitoring& monitoring_pb) { // Create a list of all topics to check if we have to remove them std::map topic_still_existing; - for(const auto& topic : topic_tree_item_map_) + for (const auto& topic : topic_tree_item_map_) { topic_still_existing[topic.first] = false; } @@ -84,12 +86,51 @@ void TopicTreeModel::monitorUpdated(const eCAL::pb::Monitoring& monitoring_pb) // Got a new topic TopicTreeItem* topic_tree_item = new TopicTreeItem(topic); insertItemIntoGroups(topic_tree_item); - topic_tree_item_map_[topic_id] = topic_tree_item; + STopicTreeEntry tree_entry; + tree_entry.tree_item = topic_tree_item; + topic_tree_item_map_[topic_id] = tree_entry; + auto fontrole = topic_tree_item->data(1, Qt::ItemDataRole::FontRole); + auto font = qvariant_cast(fontrole); + font.setBold(true); + topic_tree_item->setFont(font); + + QTimer::singleShot(10000, [this, topic_id]() + { + if(topic_tree_item_map_.find(topic_id) != topic_tree_item_map_.end()) + { + topic_tree_item_map_[topic_id].new_topic_timer = true; + } + }); } else { + auto& tree_entry = topic_tree_item_map_.at(topic_id); + auto *topic_tree_item = tree_entry.tree_item; + + if (tree_entry.striked_out) + { + auto fontrole = topic_tree_item->data(1, Qt::ItemDataRole::FontRole); + auto font = qvariant_cast(fontrole); + font.setStrikeOut(false); + font.setBold(false); + topic_tree_item->setFont(font); + tree_entry.striked_out = false; + tree_entry.default_font = true; + } + + if(tree_entry.new_topic_timer && !tree_entry.default_font) + { + auto fontrole = topic_tree_item->data(1, Qt::ItemDataRole::FontRole); + auto font = qvariant_cast(fontrole); + font.setBold(false); + topic_tree_item->setFont(font); + tree_entry.default_font = true; + } + // Update an existing topic - topic_tree_item_map_.at(topic_id)->update(topic); + tree_entry.topic_removed = false; + tree_entry.deleted_topic_timer = false; + topic_tree_item->update(topic); topic_still_existing[topic_id] = true; } } @@ -99,25 +140,49 @@ void TopicTreeModel::monitorUpdated(const eCAL::pb::Monitoring& monitoring_pb) { if (!topic.second) { - removeItemFromGroups(topic_tree_item_map_.at(topic.first)); - topic_tree_item_map_.erase(topic.first); + auto& tree_entry = topic_tree_item_map_.at(topic.first); + TopicTreeItem* topic_tree_item = tree_entry.tree_item; + + if (!tree_entry.striked_out) + { + auto fontrole = topic_tree_item->data(1, Qt::ItemDataRole::FontRole); + auto font = qvariant_cast(fontrole); + font.setStrikeOut(true); + topic_tree_item->setFont(font); + tree_entry.striked_out = true; + tree_entry.topic_removed = true; + } + + if (!tree_entry.deleted_topic_timer) + { + tree_entry.deleted_topic_timer = true; + QTimer::singleShot(10000, [this, topic_tree_item, topic]() + { + if (topic_tree_item_map_.find(topic.first) != topic_tree_item_map_.end() && topic_tree_item_map_[topic.first].topic_removed) + { + removeItemFromGroups(topic_tree_item); + topic_tree_item_map_.erase(topic.first); + } + }); + } } } updateAll(); } -QVector> TopicTreeModel::getTreeItemColumnNameMapping() const + +QVector> TopicTreeModel::getTreeItemColumnNameMapping() const { - QVector> column_name_mapping; + QVector> column_name_mapping; for (int i = 0; i < columnCount(); i++) { int column = mapColumnToItem(i, (int)TreeItemType::Topic); if (column >= 0) { - QString name = headerData(i, Qt::Orientation::Horizontal, Qt::ItemDataRole::DisplayRole).toString(); - column_name_mapping.push_back(QPair(column, name)); + const QVariant name = headerData(i, Qt::Orientation::Horizontal, Qt::ItemDataRole::DisplayRole); + column_name_mapping.push_back(QPair(column, name)); } } diff --git a/app/mon/mon_gui/src/widgets/models/topic_tree_model.h b/app/mon/mon_gui/src/widgets/models/topic_tree_model.h index ee40404821..03d29e8b7b 100644 --- a/app/mon/mon_gui/src/widgets/models/topic_tree_model.h +++ b/app/mon/mon_gui/src/widgets/models/topic_tree_model.h @@ -76,7 +76,7 @@ class TopicTreeModel : public GroupTreeModel QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; - QVector> getTreeItemColumnNameMapping() const; + QVector> getTreeItemColumnNameMapping() const; void monitorUpdated(const eCAL::pb::Monitoring& monitoring_pb) override; @@ -133,5 +133,14 @@ class TopicTreeModel : public GroupTreeModel { Columns::DATA_FREQUENCY, (int)TopicTreeItem::Columns::DFREQ }, }; - std::map topic_tree_item_map_; + struct STopicTreeEntry + { + TopicTreeItem* tree_item = nullptr; + bool default_font = false; + bool new_topic_timer = false; + bool striked_out = false; + bool deleted_topic_timer = false; + bool topic_removed = false; + }; + std::map topic_tree_item_map_; };