3#include <QtCore/QMutex>
4#include <QtCore/QSettings>
5#include <QtCore/QStringList>
6#include <QtQml/QJSEngine>
29 static QStringList* p =
new QStringList;
54QGCLoggingCategoryManager::QGCLoggingCategoryManager() : QObject()
61 _filteredFlatModel.setSourceModel(_flatModel);
63 _filteredFlatModel.setFilterCaseSensitivity(Qt::CaseInsensitive);
66 settings.beginGroup(kFilterRulesSettingsGroup);
67 for (
const QString& key : settings.childKeys()) {
68 const QVariant val = settings.value(key);
70 _enabledCategories.insert(key);
89 const QStringList segments = fullCategory.split(QLatin1Char(
'.'), Qt::SkipEmptyParts);
90 if (segments.isEmpty()) {
94 const QString shortName = segments.last();
98 QReadLocker locker(&_filterLock);
99 enabled = _isCategoryEnabled(fullCategory);
108 qCDebug(QGCLoggingCategoryRegisterLog) <<
"Set category enabled" << fullCategoryName << enable;
111 QWriteLocker locker(&_filterLock);
113 _enabledCategories.insert(fullCategoryName);
115 _enabledCategories.remove(fullCategoryName);
120 settings.beginGroup(kFilterRulesSettingsGroup);
122 settings.setValue(fullCategoryName,
true);
124 settings.remove(fullCategoryName);
127 QLoggingCategory::installFilter(_categoryFilter);
129 _refreshItemStates();
134void QGCLoggingCategoryManager::_refreshItemStates()
136 QList<std::pair<QGCLoggingCategoryItem*, bool>> updates;
137 QSet<QGCLoggingCategoryItem*> seen;
139 QReadLocker locker(&_filterLock);
140 for (
int i = 0; i < _flatModel->
count(); ++i) {
141 auto* item = _flatModel->
at(i);
143 updates.emplace_back(item, _isCategoryEnabled(item->fullCategory));
148 if (!seen.contains(treeItem)) {
149 updates.emplace_back(treeItem, _isCategoryEnabled(treeItem->fullCategory));
153 for (
auto& [item, enabled] : updates) {
154 item->setEnabledFromManager(enabled);
160 QReadLocker locker(&_filterLock);
161 return _isCategoryEnabled(fullCategoryName);
164bool QGCLoggingCategoryManager::_isCategoryEnabled(
const QString& fullCategoryName)
const
166 if (_commandLineFullLogging) {
170 const QString normalized =
171 fullCategoryName.endsWith(
'.') ? fullCategoryName.left(fullCategoryName.size() - 1) : fullCategoryName;
173 for (
const QString& cmdCat : std::as_const(_commandLineCategories)) {
174 if (normalized == cmdCat || normalized.startsWith(cmdCat +
'.')) {
179 if (_enabledCategories.contains(fullCategoryName)) {
183 for (
const QString& cat : std::as_const(_enabledCategories)) {
184 if (cat.endsWith(
'.')) {
185 const QString prefix = cat.left(cat.size() - 1);
186 if (normalized == prefix || normalized.startsWith(prefix +
'.')) {
197 if (!commandLineLoggingOptions.isEmpty()) {
198 const QStringList categoryList = commandLineLoggingOptions.split(
',', Qt::SkipEmptyParts);
200 QWriteLocker locker(&_filterLock);
201 if (!categoryList.isEmpty() && categoryList.first() == QStringLiteral(
"full")) {
202 _commandLineFullLogging =
true;
204 for (
const QString& category : categoryList) {
205 _commandLineCategories.insert(category.trimmed());
210 _refreshItemStates();
212 s_previousFilter = QLoggingCategory::installFilter(_categoryFilter);
214 qCDebug(QGCLoggingCategoryRegisterLog) <<
"Category filter installed";
217void QGCLoggingCategoryManager::_categoryFilter(QLoggingCategory* category)
219 if (s_previousFilter) {
220 s_previousFilter(category);
223 const QString categoryName = QString::fromLatin1(category->categoryName());
225 if (categoryName.startsWith(QLatin1String(
"qt."))) {
226 if (categoryName.startsWith(QLatin1String(
"qt.qml.connections"))) {
227 category->setEnabled(QtDebugMsg,
false);
228 category->setEnabled(QtWarningMsg,
false);
236 if (categoryName == QLatin1String(
"default") || categoryName == QLatin1String(
"qml")) {
242 QReadLocker locker(&manager->_filterLock);
243 const bool enabled = manager->_isCategoryEnabled(categoryName);
245 category->setEnabled(QtDebugMsg, enabled);
246 category->setEnabled(QtInfoMsg, enabled);
251 qCDebug(QGCLoggingCategoryRegisterLog) <<
"Disabling all categories";
254 QWriteLocker locker(&_filterLock);
255 _enabledCategories.clear();
259 settings.beginGroup(kFilterRulesSettingsGroup);
260 settings.remove(QString());
262 _refreshItemStates();
264 QLoggingCategory::installFilter(_categoryFilter);
271 QReadLocker locker(&_filterLock);
273 result.reserve(_enabledCategories.size());
274 for (
const QString& cat : _enabledCategories) {
275 result.append(cat.endsWith(
'.') ? cat + QLatin1Char(
'*') : cat);
283 _filteredFlatModel.setFilterFixedString(text);
291 bool enabled_, QObject* parent)
292 : QObject(parent), shortCategory(shortCategory_), fullCategory(fullCategory_), _enabled(enabled_)
295 if (!_updatingFromManager) {
312 _updatingFromManager =
true;
315 _updatingFromManager =
false;
QMutex & qgcLoggingEarlyMutex()
static QGCLoggingCategoryManager * s_managerInstance
QStringList *& qgcLoggingEarlyPending()
QMutex & qgcLoggingEarlyMutex()
QStringList *& qgcLoggingEarlyPending()
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void insertSorted(QGCLoggingCategoryItem *item)
QGCLoggingCategoryItem * at(int i) const
void forEachItem(const std::function< void(QGCLoggingCategoryItem *)> &fn)
void insertCategory(const QStringList &pathSegments, const QString &fullCategory, QGCLoggingCategoryItem *item)
void setEnabledFromManager(bool enabled)
void setEnabled(bool enabled)
QGCLoggingCategoryItem(const QString &shortCategory_, const QString &fullCategory_, bool enabled_, QObject *parent=nullptr)
QStringList enabledCategories() const
void registerCategory(const QString &category)
Q_INVOKABLE void setFilterText(const QString &text)
static QGCLoggingCategoryManager * create(QQmlEngine *qmlEngine, QJSEngine *jsEngine)
Q_INVOKABLE void setCategoryEnabled(const QString &fullCategoryName, bool enable)
Q_INVOKABLE bool isCategoryEnabled(const QString &fullCategoryName) const
static QGCLoggingCategoryManager * instance()
void installFilter(const QString &commandLineLoggingOptions=QString())
Q_INVOKABLE void disableAllCategories()
void enabledCategoriesChanged()