YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
logtab.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-License-Identifier: LGPL-2.1-or-later
4 */
5
6#include "logtab.h"
7#include "ui_logtab.h"
8
9#include <utility>
10#include <QFontMetrics>
11
13 MessageWidget* _system_message,
14 std::string _portName,
15 QWidget *parent,
16 int refreshRate) :
17 QFrame(parent),
18 ui(new Ui::LogTab),
19 portName(std::move(_portName)),
20 theLogger(_theLogger),
21 system_message(_system_message),
22 displayYarprunTimestamp_enabled(true),
23 displayLocalTimestamp_enabled(true),
24 displaySystemTime_enabled(false),
25 displayNetworkTime_enabled(false),
26 displayExternalTime_enabled(false),
27 displayLogLevel_enabled(true),
28 displayFilename_enabled(false),
29 displayLine_enabled(false),
30 displayFunction_enabled(false),
31 displayHostname_enabled(false),
32 displayPid_enabled(false),
33 displayCmd_enabled(false),
34 displayArgs_enabled(false),
35 displayThreadId_enabled(false),
36 displayComponent_enabled(true),
37 displayId_enabled(true),
38 displayColors_enabled(true),
39 displayGrid_enabled(true),
40 toggleLineExpansion(false),
41 logTimer(new QTimer(this)),
42 logModel(new LogModel()),
44 proxyModelButtons(new LogSortFilterProxyModel(this)),
45 proxyModelSearch(new LogSortFilterProxyModel(this)),
46#endif
47 clipboard(QApplication::clipboard())
48{
49 ui->setupUi(this);
50
51#if USE_FILTERS
52 proxyModelButtons->setSourceModel(logModel);
53 proxyModelSearch->setSourceModel(proxyModelButtons);
54 proxyModelSearch->setFilterKeyColumn(-1);
55 ui->listView->setModel(proxyModelSearch);
56#else
57 ui->listView->setModel(logModel);
58#endif
59
60 connect(logTimer, SIGNAL(timeout()), this, SLOT(updateLog()));
61 logTimer->start(refreshRate);
62
63 connect(ui->listView, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(ctxMenu(const QPoint &)));
64 connect(ui->listView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(expandLines()));
65
66 ui->listView->horizontalHeader()->setSectionsMovable(true);
67 ui->listView->horizontalHeader()->setSectionResizeMode(LogModel::YARPRUNTIMESTAMP_COLUMN, QHeaderView::ResizeToContents);
68 ui->listView->horizontalHeader()->setSectionResizeMode(LogModel::LOCALTIMESTAMP_COLUMN, QHeaderView::ResizeToContents);
69 ui->listView->horizontalHeader()->setSectionResizeMode(LogModel::SYSTEMTIME_COLUMN, QHeaderView::ResizeToContents);
70 ui->listView->horizontalHeader()->setSectionResizeMode(LogModel::NETWORKTIME_COLUMN, QHeaderView::ResizeToContents);
71 ui->listView->horizontalHeader()->setSectionResizeMode(LogModel::EXTERNALTIME_COLUMN, QHeaderView::ResizeToContents);
72 ui->listView->horizontalHeader()->setSectionResizeMode(LogModel::LOGLEVEL_COLUMN, QHeaderView::ResizeToContents);
73 ui->listView->horizontalHeader()->setSectionResizeMode(LogModel::LINE_COLUMN, QHeaderView::ResizeToContents);
74 ui->listView->horizontalHeader()->setSectionResizeMode(LogModel::HOSTNAME_COLUMN, QHeaderView::ResizeToContents);
75 ui->listView->horizontalHeader()->setSectionResizeMode(LogModel::PID_COLUMN, QHeaderView::ResizeToContents);
76 ui->listView->horizontalHeader()->setSectionResizeMode(LogModel::CMD_COLUMN, QHeaderView::ResizeToContents);
77 ui->listView->horizontalHeader()->setSectionResizeMode(LogModel::THREADID_COLUMN, QHeaderView::ResizeToContents);
78 ui->listView->horizontalHeader()->setSectionResizeMode(LogModel::COMPONENT_COLUMN, QHeaderView::ResizeToContents);
79 ui->listView->horizontalHeader()->setSectionResizeMode(LogModel::ID_COLUMN, QHeaderView::ResizeToContents);
80
81 ui->listView->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
82
83 sectionHeight = QFontMetrics(qvariant_cast<QFont>(logModel->data(QModelIndex(), Qt::FontRole))).height() + 4;
84 ui->listView->verticalHeader()->setMinimumSectionSize(sectionHeight);
85 ui->listView->verticalHeader()->setDefaultSectionSize(sectionHeight);
86
87 updateLog(true);
88}
89
90
91void LogTab::expandLines() {
92 toggleLineExpansion = !toggleLineExpansion;
93 ui->listView->setWordWrap(toggleLineExpansion);
94 logModel->setWordWrap(toggleLineExpansion);
95
96 if (toggleLineExpansion) {
97 ui->listView->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
98 } else {
99 ui->listView->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
100 ui->listView->verticalHeader()->setMinimumSectionSize(sectionHeight);
101 ui->listView->verticalHeader()->setDefaultSectionSize(sectionHeight);
102 }
103}
104
105void LogTab::ctxMenu(const QPoint &pos)
106{
107 auto* menu = new QMenu;
108 menu->addAction(tr("Copy to clipboard"), this, SLOT(on_copy_to_clipboard_action()));
109 menu->addAction(tr("Toggle line expansion"), this, SLOT(expandLines()));
110 menu->exec(ui->listView->mapToGlobal(pos));
111}
112
113void LogTab::on_copy_to_clipboard_action()
114{
115 QString selected_test;
116 QString separator("\t");
117 foreach(const QModelIndex &index, ui->listView->selectionModel()->selectedRows())
118 {
119 QStringList list;
120#if USE_FILTERS
121 QModelIndex prox_index_pre = proxyModelSearch->mapToSource(index);
122 if (!prox_index_pre.isValid())
123 {
124 system_message->addMessage(QString("Invalid prox_index_pre in copy_to_clipboard"));
125 return;
126 }
127 QModelIndex prox_index = proxyModelButtons->mapToSource(prox_index_pre);
128 if (!prox_index.isValid())
129 {
130 system_message->addMessage(QString("Invalid prox_index in copy_to_clipboard"));
131 return;
132 }
133#else
134 QModelIndex prox_index = index;
135#endif
136 if (displayYarprunTimestamp_enabled) { list.append(logModel->data(prox_index, LogModel::YarprunTimestampRole).toString()); }
137 if (displayLocalTimestamp_enabled) { list.append(logModel->data(prox_index, LogModel::LocalTimestampRole).toString()); }
138 if (displaySystemTime_enabled) { list.append(logModel->data(prox_index, LogModel::SystemTimeStringRole).toString()); }
139 if (displayNetworkTime_enabled) { list.append(logModel->data(prox_index, LogModel::NetworkTimeStringRole).toString()); }
140 if (displayExternalTime_enabled) { list.append(logModel->data(prox_index, LogModel::ExternalTimeStringRole).toString()); }
141 if (displayLogLevel_enabled) { list.append(logModel->data(prox_index, LogModel::LogLevelStringRole).toString()); }
142 if (displayFilename_enabled) { list.append(logModel->data(prox_index, LogModel::FilenameRole).toString()); }
143 if (displayLine_enabled) { list.append(logModel->data(prox_index, LogModel::LineStringRole).toString()); }
144 if (displayFunction_enabled) { list.append(logModel->data(prox_index, LogModel::FunctionRole).toString()); }
145 if (displayHostname_enabled) { list.append(logModel->data(prox_index, LogModel::HostnameRole).toString()); }
146 if (displayPid_enabled) { list.append(logModel->data(prox_index, LogModel::PidStringRole).toString()); }
147 if (displayCmd_enabled) { list.append(logModel->data(prox_index, LogModel::CmdRole).toString()); }
148 if (displayArgs_enabled) { list.append(logModel->data(prox_index, LogModel::ArgsRole).toString()); }
149 if (displayThreadId_enabled) { list.append(logModel->data(prox_index, LogModel::ThreadIdRole).toString()); }
150 if (displayComponent_enabled) { list.append(logModel->data(prox_index, LogModel::ComponentRole).toString()); }
151 if (displayId_enabled) { list.append(logModel->data(prox_index, LogModel::IdRole).toString()); }
152 list.append(logModel->data(prox_index, LogModel::TextRole).toString());
153 selected_test += list.join(separator);
154 selected_test += '\n';
155 }
156 clipboard->setText(selected_test);
157}
158
160{
161 delete logTimer;
162 delete logModel;
163#if USE_FILTERS
164 delete proxyModelButtons;
165 delete proxyModelSearch;
166#endif
167 delete ui;
168}
169
171{
172 mutex.lock();
173 if (logModel) {
174 logModel->clear();
175 }
176 mutex.unlock();
177}
178
179void LogTab::updateLog(bool from_beginning)
180{
181 mutex.lock();
182 std::list<yarp::yarpLogger::MessageEntry> messages;
183 theLogger->get_messages_by_port_complete(portName, messages, from_beginning);
184 logModel->addMessages(messages);
185
186 ui->listView->setColumnHidden(LogModel::YARPRUNTIMESTAMP_COLUMN, !displayYarprunTimestamp_enabled);
187 ui->listView->setColumnHidden(LogModel::LOCALTIMESTAMP_COLUMN, !displayLocalTimestamp_enabled);
188 ui->listView->setColumnHidden(LogModel::SYSTEMTIME_COLUMN, !displaySystemTime_enabled);
189 ui->listView->setColumnHidden(LogModel::NETWORKTIME_COLUMN, !displayNetworkTime_enabled);
190 ui->listView->setColumnHidden(LogModel::EXTERNALTIME_COLUMN, !displayExternalTime_enabled);
191 ui->listView->setColumnHidden(LogModel::LOGLEVEL_COLUMN, !displayLogLevel_enabled);
192 ui->listView->setColumnHidden(LogModel::FILENAME_COLUMN, !displayFilename_enabled);
193 ui->listView->setColumnHidden(LogModel::LINE_COLUMN, !displayLine_enabled);
194 ui->listView->setColumnHidden(LogModel::FUNCTION_COLUMN, !displayFunction_enabled);
195 ui->listView->setColumnHidden(LogModel::HOSTNAME_COLUMN, !displayHostname_enabled);
196 ui->listView->setColumnHidden(LogModel::PID_COLUMN, !displayPid_enabled);
197 ui->listView->setColumnHidden(LogModel::CMD_COLUMN, !displayCmd_enabled);
198 ui->listView->setColumnHidden(LogModel::ARGS_COLUMN, !displayArgs_enabled);
199 ui->listView->setColumnHidden(LogModel::COMPONENT_COLUMN, !displayComponent_enabled);
200 ui->listView->setColumnHidden(LogModel::ID_COLUMN, !displayId_enabled);
201 ui->listView->setShowGrid(displayGrid_enabled);
202 mutex.unlock();
203}
204
206{
207 displayYarprunTimestamp_enabled = enabled;
208 ui->listView->setColumnHidden(LogModel::YARPRUNTIMESTAMP_COLUMN, !displayYarprunTimestamp_enabled);
209}
210
212{
213 displayLocalTimestamp_enabled = enabled;
214 ui->listView->setColumnHidden(LogModel::LOCALTIMESTAMP_COLUMN, !displayLocalTimestamp_enabled);
215}
216
218{
219 displaySystemTime_enabled = enabled;
220 ui->listView->setColumnHidden(LogModel::SYSTEMTIME_COLUMN, !displaySystemTime_enabled);
221}
222
224{
225 displayNetworkTime_enabled = enabled;
226 ui->listView->setColumnHidden(LogModel::SYSTEMTIME_COLUMN, !displayNetworkTime_enabled);
227}
228
230{
231 displayExternalTime_enabled = enabled;
232 ui->listView->setColumnHidden(LogModel::SYSTEMTIME_COLUMN, !displayExternalTime_enabled);
233}
234
235
236void LogTab::displayLogLevel(bool enabled)
237{
238 displayLogLevel_enabled = enabled;
239 ui->listView->setColumnHidden(LogModel::LOGLEVEL_COLUMN, !displayLogLevel_enabled);
240}
241
242void LogTab::displayFilename(bool enabled)
243{
244 displayFilename_enabled = enabled;
245 ui->listView->setColumnHidden(LogModel::FILENAME_COLUMN, !displayFilename_enabled);
246 if (enabled) {
247 ui->listView->setColumnWidth(LogModel::FILENAME_COLUMN, 120);
248 }
249}
250
251void LogTab::displayLine(bool enabled)
252{
253 displayLine_enabled = enabled;
254 ui->listView->setColumnHidden(LogModel::LINE_COLUMN, !displayLine_enabled);
255}
256
257void LogTab::displayFunction(bool enabled)
258{
259 displayFunction_enabled = enabled;
260 ui->listView->setColumnHidden(LogModel::FUNCTION_COLUMN, !displayFunction_enabled);
261 if (enabled) {
262 ui->listView->setColumnWidth(LogModel::FUNCTION_COLUMN, 120);
263 }
264}
265
266void LogTab::displayHostname(bool enabled)
267{
268 displayHostname_enabled = enabled;
269 ui->listView->setColumnHidden(LogModel::THREADID_COLUMN, !displayHostname_enabled);
270}
271
272void LogTab::displayCmd(bool enabled)
273{
274 displayCmd_enabled = enabled;
275 ui->listView->setColumnHidden(LogModel::THREADID_COLUMN, !displayCmd_enabled);
276}
277
278void LogTab::displayArgs(bool enabled)
279{
280 displayArgs_enabled = enabled;
281 ui->listView->setColumnHidden(LogModel::THREADID_COLUMN, !displayArgs_enabled);
282 if (enabled) {
283 ui->listView->setColumnWidth(LogModel::FUNCTION_COLUMN, 120);
284 }
285}
286
287void LogTab::displayPid(bool enabled)
288{
289 displayPid_enabled = enabled;
290 ui->listView->setColumnHidden(LogModel::THREADID_COLUMN, !displayPid_enabled);
291}
292
293void LogTab::displayThreadId(bool enabled)
294{
295 displayThreadId_enabled = enabled;
296 ui->listView->setColumnHidden(LogModel::THREADID_COLUMN, !displayThreadId_enabled);
297}
298
299void LogTab::displayComponent(bool enabled)
300{
301 displayComponent_enabled = enabled;
302 ui->listView->setColumnHidden(LogModel::COMPONENT_COLUMN, !displayComponent_enabled);
303}
304
305void LogTab::displayId(bool enabled)
306{
307 displayId_enabled = enabled;
308 ui->listView->setColumnHidden(LogModel::ID_COLUMN, !displayId_enabled);
309}
310
311void LogTab::displayColors(bool enabled)
312{
313 displayColors_enabled = enabled;
314 logModel->setColor(enabled);
315}
316
317void LogTab::displayGrid(bool enabled)
318{
319 displayGrid_enabled = enabled;
320 ui->listView->setShowGrid(displayGrid_enabled);
321}
int SIGNAL(int pid, int signum)
static constexpr int YARPRUNTIMESTAMP_COLUMN
Definition logmodel.h:49
static constexpr int LINE_COLUMN
Definition logmodel.h:56
void setWordWrap(bool wordwrap)
Definition logmodel.cpp:392
static constexpr int SYSTEMTIME_COLUMN
Definition logmodel.h:51
static constexpr int FUNCTION_COLUMN
Definition logmodel.h:57
@ LogLevelStringRole
Definition logmodel.h:31
@ LocalTimestampRole
Definition logmodel.h:23
@ ComponentRole
Definition logmodel.h:43
@ PidStringRole
Definition logmodel.h:40
@ ArgsRole
Definition logmodel.h:39
@ LineStringRole
Definition logmodel.h:34
@ NetworkTimeStringRole
Definition logmodel.h:27
@ ExternalTimeStringRole
Definition logmodel.h:29
@ HostnameRole
Definition logmodel.h:36
@ YarprunTimestampRole
Definition logmodel.h:22
@ SystemTimeStringRole
Definition logmodel.h:25
@ FunctionRole
Definition logmodel.h:35
@ TextRole
Definition logmodel.h:45
@ FilenameRole
Definition logmodel.h:32
@ ThreadIdRole
Definition logmodel.h:41
@ CmdRole
Definition logmodel.h:38
void addMessages(const std::list< yarp::yarpLogger::MessageEntry > &messages)
Definition logmodel.cpp:367
static constexpr int CMD_COLUMN
Definition logmodel.h:60
static constexpr int COMPONENT_COLUMN
Definition logmodel.h:63
static constexpr int LOCALTIMESTAMP_COLUMN
Definition logmodel.h:50
static constexpr int PID_COLUMN
Definition logmodel.h:59
static constexpr int LOGLEVEL_COLUMN
Definition logmodel.h:54
static constexpr int FILENAME_COLUMN
Definition logmodel.h:55
static constexpr int ARGS_COLUMN
Definition logmodel.h:61
void clear()
Definition logmodel.cpp:402
void setColor(bool enabled)
Definition logmodel.cpp:381
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
Definition logmodel.cpp:122
static constexpr int THREADID_COLUMN
Definition logmodel.h:62
static constexpr int HOSTNAME_COLUMN
Definition logmodel.h:58
static constexpr int NETWORKTIME_COLUMN
Definition logmodel.h:52
static constexpr int ID_COLUMN
Definition logmodel.h:64
static constexpr int EXTERNALTIME_COLUMN
Definition logmodel.h:53
void displayGrid(bool enabled)
Definition logtab.cpp:317
void displayPid(bool enabled)
Definition logtab.cpp:287
QTimer * logTimer
Definition logtab.h:70
void displayLocalTimestamp(bool enabled)
Definition logtab.cpp:211
void displaySystemTime(bool enabled)
Definition logtab.cpp:217
LogModel * logModel
Definition logtab.h:71
void displayExternalTime(bool enabled)
Definition logtab.cpp:229
void displayLine(bool enabled)
Definition logtab.cpp:251
void displayYarprunTimestamp(bool enabled)
Definition logtab.cpp:205
~LogTab()
Definition logtab.cpp:159
LogTab(yarp::yarpLogger::LoggerEngine *_theLogger, MessageWidget *_system_message, std::string _portName, QWidget *parent=0, int refreshRate=100)
Definition logtab.cpp:12
void displayFunction(bool enabled)
Definition logtab.cpp:257
void displayLogLevel(bool enabled)
Definition logtab.cpp:236
LogSortFilterProxyModel * proxyModelButtons
Definition logtab.h:74
void displayId(bool enabled)
Definition logtab.cpp:305
void displayHostname(bool enabled)
Definition logtab.cpp:266
void displayColors(bool enabled)
Definition logtab.cpp:311
void displayFilename(bool enabled)
Definition logtab.cpp:242
LogSortFilterProxyModel * proxyModelSearch
Definition logtab.h:75
void displayCmd(bool enabled)
Definition logtab.cpp:272
void displayArgs(bool enabled)
Definition logtab.cpp:278
void displayThreadId(bool enabled)
Definition logtab.cpp:293
void clearLogModel()
Definition logtab.cpp:170
QClipboard * clipboard
Definition logtab.h:77
void displayNetworkTime(bool enabled)
Definition logtab.cpp:223
void displayComponent(bool enabled)
Definition logtab.cpp:299
void addMessage(QString text, int level=0)
void get_messages_by_port_complete(std::string port, std::list< MessageEntry > &messages, bool from_beginning=false)
#define USE_FILTERS
Definition logtab.h:72
Definition aboutdlg.h:11
STL namespace.