diff --git a/src/layui/layui/layNetlistBrowserPage.cc b/src/layui/layui/layNetlistBrowserPage.cc index 58a4a7b23..51e4b367c 100644 --- a/src/layui/layui/layNetlistBrowserPage.cc +++ b/src/layui/layui/layNetlistBrowserPage.cc @@ -1132,12 +1132,16 @@ NetlistBrowserPage::setup_trees () db::LayoutToNetlist *l2ndb = mp_database.get (); db::LayoutVsSchematic *lvsdb = dynamic_cast (l2ndb); + QIcon log_tab_icon; + if ((lvsdb && lvsdb->cross_ref ()) || (l2ndb && ! l2ndb->log_entries ().empty ())) { NetlistLogModel *new_model = new NetlistLogModel (log_view, lvsdb->cross_ref (), l2ndb); delete log_view->model (); log_view->setModel (new_model); + log_tab_icon = NetlistLogModel::icon_for_severity (new_model->max_severity ()); + } else { delete log_view->model (); @@ -1145,6 +1149,8 @@ NetlistBrowserPage::setup_trees () } + mode_tab->setTabIcon (3, log_tab_icon); + { // NOTE: with the tree as the parent, the tree will take over ownership of the model NetlistBrowserModel *new_model = new NetlistBrowserModel (nl_directory_tree, l2ndb, &m_colorizer); diff --git a/src/layui/layui/layNetlistLogModel.cc b/src/layui/layui/layNetlistLogModel.cc index 7bf06c714..c89ef2c22 100644 --- a/src/layui/layui/layNetlistLogModel.cc +++ b/src/layui/layui/layNetlistLogModel.cc @@ -79,19 +79,33 @@ namespace { const std::string var_sep (" \u21D4 "); NetlistLogModel::NetlistLogModel (QWidget *parent, const db::NetlistCrossReference *cross_ref, const db::LayoutToNetlist *l2n) - : QAbstractItemModel (parent) + : QAbstractItemModel (parent), m_max_severity (db::NoSeverity) { tl_assert (cross_ref->netlist_a () != 0); tl_assert (cross_ref->netlist_b () != 0); mp_lvsdb_messages = cross_ref ? &cross_ref->other_log_entries () : 0; + if (mp_lvsdb_messages) { + for (auto l = mp_lvsdb_messages->begin (); l != mp_lvsdb_messages->end (); ++l) { + m_max_severity = std::max (m_max_severity, l->severity); + } + } + mp_l2n_messages = l2n ? &l2n->log_entries () : 0; + if (mp_l2n_messages) { + for (auto l = mp_l2n_messages->begin (); l != mp_l2n_messages->end (); ++l) { + m_max_severity = std::max (m_max_severity, l->severity); + } + } m_global_entries = int ((mp_lvsdb_messages ? mp_lvsdb_messages->size () : 0) + (mp_l2n_messages ? mp_l2n_messages->size () : 0)); for (auto i = cross_ref->begin_circuits (); i != cross_ref->end_circuits (); ++i) { const db::NetlistCrossReference::PerCircuitData *pcd = cross_ref->per_circuit_data_for (*i); if (pcd && (i->first || i->second) && ! pcd->log_entries.empty ()) { + for (auto l = pcd->log_entries.begin (); l != pcd->log_entries.end (); ++l) { + m_max_severity = std::max (m_max_severity, l->severity); + } m_circuits.push_back (std::make_pair (*i, &pcd->log_entries)); } } @@ -152,6 +166,20 @@ NetlistLogModel::columnCount (const QModelIndex & /*parent*/) const return 1; } +QIcon +NetlistLogModel::icon_for_severity (db::Severity severity) +{ + if (severity == db::Error) { + return QIcon (QString::fromUtf8 (":/error_16px.png")); + } else if (severity == db::Warning) { + return QIcon (QString::fromUtf8 (":/warn_16px.png")); + } else if (severity == db::Info) { + return QIcon (QString::fromUtf8 (":/info_16px.png")); + } else { + return QIcon (); + } +} + QVariant NetlistLogModel::data (const QModelIndex &index, int role) const { @@ -172,14 +200,8 @@ NetlistLogModel::data (const QModelIndex &index, int role) const if (role == Qt::DecorationRole) { - if (! le) { - // ignore - } else if (le->severity == db::Error) { - return QIcon (QString::fromUtf8 (":/error_16px.png")); - } else if (le->severity == db::Warning) { - return QIcon (QString::fromUtf8 (":/warn_16px.png")); - } else if (le->severity == db::Info) { - return QIcon (QString::fromUtf8 (":/info_16px.png")); + if (le) { + return icon_for_severity (le->severity); } } else if (role == Qt::DisplayRole) { diff --git a/src/layui/layui/layNetlistLogModel.h b/src/layui/layui/layNetlistLogModel.h index cd4178936..bbd26f2eb 100644 --- a/src/layui/layui/layNetlistLogModel.h +++ b/src/layui/layui/layNetlistLogModel.h @@ -30,6 +30,7 @@ #include "dbLayoutToNetlist.h" #include +#include namespace lay { @@ -51,12 +52,20 @@ public: virtual QVariant data (const QModelIndex &index, int role) const; virtual QVariant headerData (int section, Qt::Orientation orientation, int role) const; + static QIcon icon_for_severity (db::Severity severity); + + db::Severity max_severity () const + { + return m_max_severity; + } + private: typedef std::pair, const db::NetlistCrossReference::PerCircuitData::log_entries_type *> circuit_entry; std::vector m_circuits; const db::NetlistCrossReference::PerCircuitData::log_entries_type *mp_lvsdb_messages; const db::LayoutToNetlist::log_entries_type *mp_l2n_messages; int m_global_entries; + db::Severity m_max_severity; }; }