Log tab now shows max severity of logs

This commit is contained in:
Matthias Koefferlein 2023-09-17 23:33:47 +02:00
parent 2fe611a75c
commit 033d630992
3 changed files with 46 additions and 9 deletions

View File

@ -1132,12 +1132,16 @@ NetlistBrowserPage::setup_trees ()
db::LayoutToNetlist *l2ndb = mp_database.get ();
db::LayoutVsSchematic *lvsdb = dynamic_cast<db::LayoutVsSchematic *> (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);

View File

@ -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) {

View File

@ -30,6 +30,7 @@
#include "dbLayoutToNetlist.h"
#include <QAbstractItemModel>
#include <QIcon>
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<std::pair<const db::Circuit *, const db::Circuit *>, const db::NetlistCrossReference::PerCircuitData::log_entries_type *> circuit_entry;
std::vector<circuit_entry> 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;
};
}