logs_table_model.cpp
Go to the documentation of this file.
1 #include "logs_table_model.hpp"
2 #include <QDateTime>
3 #include <QBrush>
4 #include <QColor>
5 #include <QDebug>
6 
7 LogsTableModel::LogsTableModel(QObject* parent) : QAbstractTableModel(parent), _logs(MAX_CAPACITY) // initial capacity
8 {
9  _count = 0;
10 }
11 
12 QVariant LogsTableModel::headerData(int section, Qt::Orientation orientation, int role) const
13 {
14  if (role != Qt::DisplayRole)
15  return QVariant();
16 
17  if (orientation == Qt::Horizontal)
18  {
19  switch (section)
20  {
21  case 0:
22  return "#";
23  break;
24  case 1:
25  return "Time";
26  break;
27  case 2:
28  return "Severity";
29  break;
30  case 3:
31  return "Node";
32  break;
33  case 4:
34  return "Message";
35  break;
36  case 5:
37  return "Source";
38  break;
39  }
40  }
41  else
42  {
43  return QString("%1").arg(section);
44  }
45 
46  return QVariant();
47 }
48 
49 int LogsTableModel::rowCount(const QModelIndex& parent) const
50 {
51  if (parent.isValid())
52  return 0;
53 
54  return _logs.size();
55 }
56 
57 int LogsTableModel::columnCount(const QModelIndex& parent) const
58 {
59  if (parent.isValid())
60  return 0;
61 
62  return 5;
63 }
64 
65 QVariant LogsTableModel::data(const QModelIndex& index, int role) const
66 {
67  if (!index.isValid())
68  return QVariant();
69 
70  if (index.row() >= _logs.size())
71  return QVariant();
72 
73  const LogItem& log = _logs[index.row()];
74 
75  if (role == Qt::DisplayRole)
76  {
77  switch (index.column())
78  {
79  case 0:
80  return (int)log.count;
81  case 1:
82  return log.time_text;
83  case 2: {
84  switch (log.level_raw)
85  {
86  case DEBUG:
87  return "DEBUG";
88  case INFO:
89  return "INFO";
90  case WARNINGS:
91  return "WARNINGS";
92  case ERROR:
93  return "ERROR";
94  }
95  }
96  break;
97  case 3:
98  return (*log.node);
99  case 4:
100  return log.message;
101  case 5:
102  return (*log.source);
103  }
104  }
105  else if (role == Qt::ForegroundRole)
106  {
107  switch (log.level_raw)
108  {
109  case DEBUG:
110  return QBrush(QColor::fromRgb(50, 50, 50)); // black
111  case INFO:
112  return QBrush(QColor::fromRgb(0, 0, 255)); // blue
113  case WARNINGS:
114  return QBrush(QColor::fromRgb(240, 120, 0)); // orange
115  case ERROR:
116  return QBrush(QColor::fromRgb(255, 0, 0)); // red
117  }
118  }
119  else if (role == Qt::UserRole)
120  {
121  switch (index.column())
122  {
123  case 0:
124  return (int)log.count;
125  case 1: {
126  auto usec = (long long)log.time_usec_since_epoch;
127  return QVariant(usec);
128  }
129  case 2:
130  return log.level_raw;
131  case 3:
132  return *log.node;
133  case 4:
134  return log.message;
135  case 5:
136  return *log.source;
137  }
138  }
139  else
140  {
141  return QVariant();
142  }
143  return QVariant();
144 }
145 
147 {
148  _count++;
149 
150  LogItem item;
151  switch (log.level)
152  {
153  case rosgraph_msgs::Log::DEBUG:
154  item.level_raw = DEBUG;
155  break;
156  case rosgraph_msgs::Log::INFO:
157  item.level_raw = INFO;
158  break;
159  case rosgraph_msgs::Log::WARN:
160  item.level_raw = WARNINGS;
161  break;
162  case rosgraph_msgs::Log::ERROR:
163  item.level_raw = ERROR;
164  break;
165  }
166 
167  item.count = _count;
168 
169  QString node_name = QString::fromStdString(log.name);
170  auto node_it = _node_list.find(node_name);
171 
172  if (node_it == _node_list.end())
173  {
174  auto inserted_ret = _node_list.insert(node_name);
175  node_it = inserted_ret.first;
176  }
177  item.node = &(*node_it);
178 
179  QString source_name(log.file.c_str());
180  source_name += (" ");
181  source_name += QString::fromStdString(log.function);
182  source_name += (":");
183  source_name += QString::number(log.line);
184 
185  auto source_it = _source_list.find(source_name);
186 
187  if (source_it == _source_list.end())
188  {
189  auto inserted_ret = _source_list.insert(source_name);
190  source_it = inserted_ret.first;
191  }
192  item.source = &(*source_it);
193 
194  item.message = log.msg.c_str();
195 
196  item.time_usec_since_epoch = log.header.stamp.toNSec() / 1000;
197  item.time_text = QDateTime::fromMSecsSinceEpoch(item.time_usec_since_epoch / 1000).toString("d/M/yy HH:mm::ss.zzz");
198  return item;
199 }
200 
201 void LogsTableModel::push_back(const rosgraph_msgs::Log::ConstPtr& pushed_log)
202 {
203  bool to_shift = (_logs.size() == MAX_CAPACITY);
204 
205  _logs.push_back(convertRosout(*pushed_log));
206 
207  if (to_shift)
208  {
209  this->beginRemoveRows(QModelIndex(), 0, 0);
210  this->endRemoveRows();
211  emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
212  }
213 
214  this->beginInsertRows(QModelIndex(), _logs.size() - 1, _logs.size() - 1);
215  this->endInsertRows();
216 }
217 
218 void LogsTableModel::push_back(const std::vector<rosgraph_msgs::Log::ConstPtr>& pushed_logs)
219 {
220  size_t old_size = _logs.size();
221  size_t new_size = old_size + pushed_logs.size();
222 
223  int to_add = pushed_logs.size();
224  int to_shift = 0;
225 
226  if (new_size > MAX_CAPACITY)
227  {
228  to_add = (MAX_CAPACITY - old_size);
229  to_shift = new_size - MAX_CAPACITY;
230  new_size = MAX_CAPACITY;
231  }
232 
233  const size_t last_row = new_size - 1;
234  const size_t first_row = new_size - pushed_logs.size();
235 
236  for (int i = 0; i < pushed_logs.size(); i++)
237  {
238  _logs.push_back(convertRosout(*pushed_logs[i]));
239  }
240 
241  std::sort(_logs.begin(), _logs.end(),
242  [](const LogItem& a, const LogItem& b) { return a.time_usec_since_epoch < b.time_usec_since_epoch; });
243 
244  if (to_shift > 0)
245  {
246  this->beginRemoveRows(QModelIndex(), 0, 0);
247  this->endRemoveRows();
248 
249  emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
250  }
251 
252  this->beginInsertRows(QModelIndex(), first_row, last_row);
253  this->endInsertRows();
254 }
255 
256 const QString& LogsTableModel::message(int index) const
257 {
258  return _logs[index].message;
259 }
260 
261 const QString& LogsTableModel::nodeName(int index) const
262 {
263  return *(_logs[index].node);
264 }
265 
267 {
268  return _logs[index].level_raw;
269 }
270 
272 {
273  std::chrono::microseconds since_epoch(_logs[index].time_usec_since_epoch);
274  return TimePoint() + since_epoch;
275 }
276 
278 {
279  this->beginRemoveRows(QModelIndex(), 0, _logs.size() - 1);
280  this->endRemoveRows();
281  _logs.clear();
282  _count = 0;
283 }
LogsTableModel::Severity
Severity
Definition: logs_table_model.hpp:27
LogsTableModel::timestamp
TimePoint timestamp(int index) const
Definition: logs_table_model.cpp:271
TimePoint
std::chrono::high_resolution_clock::time_point TimePoint
Definition: logs_table_model.hpp:17
LogsTableModel::_logs
boost::circular_buffer< LogItem > _logs
Definition: logs_table_model.hpp:75
LogsTableModel::message
const QString & message(int index) const
Definition: logs_table_model.cpp:256
index
std::size_t index
LogsTableModel::LogItem::time_usec_since_epoch
int64_t time_usec_since_epoch
Definition: logs_table_model.hpp:67
LogsTableModel::LogsTableModel
LogsTableModel(QObject *parent=0)
Definition: logs_table_model.cpp:7
LogsTableModel::ERROR
@ ERROR
Definition: logs_table_model.hpp:31
i
size_t & i
LogsTableModel::LogItem::node
const QString * node
Definition: logs_table_model.hpp:70
LogsTableModel::severity
Severity severity(int index) const
Definition: logs_table_model.cpp:266
LogsTableModel::_source_list
std::set< QString > _source_list
Definition: logs_table_model.hpp:62
LogsTableModel::LogItem::source
const QString * source
Definition: logs_table_model.hpp:72
LogsTableModel::_node_list
std::set< QString > _node_list
Definition: logs_table_model.hpp:63
LogsTableModel::LogItem::message
QString message
Definition: logs_table_model.hpp:71
LogsTableModel::LogItem::level_raw
Severity level_raw
Definition: logs_table_model.hpp:69
LogsTableModel::LogItem::count
size_t count
Definition: logs_table_model.hpp:66
logs_table_model.hpp
LogsTableModel::columnCount
int columnCount(const QModelIndex &parent=QModelIndex()) const override
Definition: logs_table_model.cpp:57
LogsTableModel::clear
void clear()
Definition: logs_table_model.cpp:277
LogsTableModel::LogItem
Definition: logs_table_model.hpp:65
LogsTableModel::INFO
@ INFO
Definition: logs_table_model.hpp:29
LogsTableModel::LogItem::time_text
QString time_text
Definition: logs_table_model.hpp:68
LogsTableModel::data
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
Definition: logs_table_model.cpp:65
LogsTableModel::_count
size_t _count
Definition: logs_table_model.hpp:77
LogsTableModel::convertRosout
LogItem convertRosout(const rosgraph_msgs::Log &log)
Definition: logs_table_model.cpp:146
LogsTableModel::nodeName
const QString & nodeName(int index) const
Definition: logs_table_model.cpp:261
LogsTableModel::MAX_CAPACITY
@ MAX_CAPACITY
Definition: logs_table_model.hpp:79
LogsTableModel::headerData
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
Definition: logs_table_model.cpp:12
LogsTableModel::DEBUG
@ DEBUG
Definition: logs_table_model.hpp:28
LogsTableModel::WARNINGS
@ WARNINGS
Definition: logs_table_model.hpp:30
LogsTableModel::rowCount
int rowCount(const QModelIndex &parent=QModelIndex()) const override
Definition: logs_table_model.cpp:49
LogsTableModel::push_back
void push_back(const rosgraph_msgs::Log::ConstPtr &pushed_log)
Definition: logs_table_model.cpp:201


plotjuggler_ros
Author(s): Davide Faconti
autogenerated on Wed Feb 21 2024 03:22:55