3#include <QtCore/QSettings>
4#include <QtCore/QStringList>
5#include <QtQml/QJSEngine>
37QGCLoggingCategoryManager::QGCLoggingCategoryManager() : QObject()
44 _filteredFlatModel.setSourceModel(_flatModel);
46 _filteredFlatModel.setFilterCaseSensitivity(Qt::CaseInsensitive);
49 settings.beginGroup(kFilterRulesSettingsGroup);
50 for (
const QString& key : settings.childKeys()) {
51 const QVariant val = settings.value(key);
53 _enabledCategories.insert(key);
57 const auto categories =
59 for (
const auto& category : categories)
65 const QStringList segments = fullCategory.split(QLatin1Char(
'.'), Qt::SkipEmptyParts);
66 if (segments.isEmpty()) {
70 const QString shortName = segments.last();
74 QReadLocker locker(&_filterLock);
75 enabled = _isCategoryEnabled(fullCategory);
84 qCDebug(QGCLoggingCategoryRegisterLog) <<
"Set category enabled" << fullCategoryName << enable;
87 QWriteLocker locker(&_filterLock);
89 _enabledCategories.insert(fullCategoryName);
91 _enabledCategories.remove(fullCategoryName);
96 settings.beginGroup(kFilterRulesSettingsGroup);
98 settings.setValue(fullCategoryName,
true);
100 settings.remove(fullCategoryName);
103 QLoggingCategory::installFilter(_categoryFilter);
105 _refreshItemStates();
110void QGCLoggingCategoryManager::_refreshItemStates()
112 QList<std::pair<QGCLoggingCategoryItem*, bool>> updates;
113 QSet<QGCLoggingCategoryItem*> seen;
115 QReadLocker locker(&_filterLock);
116 for (
int i = 0; i < _flatModel->
count(); ++i) {
117 auto* item = _flatModel->
at(i);
119 updates.emplace_back(item, _isCategoryEnabled(item->fullCategory));
124 if (!seen.contains(treeItem)) {
125 updates.emplace_back(treeItem, _isCategoryEnabled(treeItem->fullCategory));
129 for (
auto& [item, enabled] : updates) {
130 item->setEnabledFromManager(enabled);
136 QReadLocker locker(&_filterLock);
137 return _isCategoryEnabled(fullCategoryName);
140bool QGCLoggingCategoryManager::_isCategoryEnabled(
const QString& fullCategoryName)
const
142 if (_commandLineFullLogging) {
146 const QString normalized =
147 fullCategoryName.endsWith(
'.') ? fullCategoryName.left(fullCategoryName.size() - 1) : fullCategoryName;
149 for (
const QString& cmdCat : std::as_const(_commandLineCategories)) {
150 if (normalized == cmdCat || normalized.startsWith(cmdCat +
'.')) {
155 if (_enabledCategories.contains(fullCategoryName)) {
159 for (
const QString& cat : std::as_const(_enabledCategories)) {
160 if (cat.endsWith(
'.')) {
161 const QString prefix = cat.left(cat.size() - 1);
162 if (normalized == prefix || normalized.startsWith(prefix +
'.')) {
173 if (!commandLineLoggingOptions.isEmpty()) {
174 const QStringList categoryList = commandLineLoggingOptions.split(
',', Qt::SkipEmptyParts);
176 QWriteLocker locker(&_filterLock);
177 if (!categoryList.isEmpty() && categoryList.first() == QStringLiteral(
"full")) {
178 _commandLineFullLogging =
true;
180 for (
const QString& category : categoryList) {
181 _commandLineCategories.insert(category.trimmed());
186 _refreshItemStates();
188 s_previousFilter = QLoggingCategory::installFilter(_categoryFilter);
190 qCDebug(QGCLoggingCategoryRegisterLog) <<
"Category filter installed";
193void QGCLoggingCategoryManager::_categoryFilter(QLoggingCategory* category)
195 if (s_previousFilter) {
196 s_previousFilter(category);
199 const QString categoryName = QString::fromLatin1(category->categoryName());
201 if (categoryName.startsWith(QLatin1String(
"qt."))) {
202 if (categoryName.startsWith(QLatin1String(
"qt.qml.connections"))) {
203 category->setEnabled(QtDebugMsg,
false);
204 category->setEnabled(QtWarningMsg,
false);
212 if (categoryName == QLatin1String(
"default") || categoryName == QLatin1String(
"qml")) {
218 QReadLocker locker(&manager->_filterLock);
219 const bool enabled = manager->_isCategoryEnabled(categoryName);
221 category->setEnabled(QtDebugMsg, enabled);
222 category->setEnabled(QtInfoMsg, enabled);
227 qCDebug(QGCLoggingCategoryRegisterLog) <<
"Disabling all categories";
230 QWriteLocker locker(&_filterLock);
231 _enabledCategories.clear();
235 settings.beginGroup(kFilterRulesSettingsGroup);
236 settings.remove(QString());
238 _refreshItemStates();
240 QLoggingCategory::installFilter(_categoryFilter);
247 QReadLocker locker(&_filterLock);
249 result.reserve(_enabledCategories.size());
250 for (
const QString& cat : _enabledCategories) {
251 result.append(cat.endsWith(
'.') ? cat + QLatin1Char(
'*') : cat);
259 _filteredFlatModel.setFilterFixedString(text);
267 bool enabled_, QObject* parent)
268 : QObject(parent), shortCategory(shortCategory_), fullCategory(fullCategory_), _enabled(enabled_)
271 if (!_updatingFromManager) {
288 _updatingFromManager =
true;
291 _updatingFromManager =
false;
static QGCLoggingCategoryManager * s_managerInstance
QStringList qgcObserveLoggingCategories(QObject *context, std::function< void(const QString &)> observer)
#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, 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()