Add LL_DIALOG log level, which can trigger the GUI to show a message box containing the log message
This commit is contained in:
parent
695ff3c8a0
commit
f1e7ea298f
6 changed files with 71 additions and 88 deletions
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
#include "filesystem.h"
|
#include "filesystem.h"
|
||||||
|
|
||||||
const char* LogManager::log_codes[] = {"FATAL:", "ERROR:", "Warning:", "Info:", "Verbose:", "Debug:", "Trace:"};
|
const char* LogManager::log_codes[] = {"FATAL:", "ERROR:", "Warning:", "Info:", "Verbose:", "Debug:", "Trace:", "Dialog:"};
|
||||||
|
|
||||||
LogManager::LogManager()
|
LogManager::LogManager()
|
||||||
{
|
{
|
||||||
|
|
@ -154,7 +154,7 @@ void LogManager::_flush()
|
||||||
{
|
{
|
||||||
for(size_t msg = 0; msg < temp_messages.size(); ++msg)
|
for(size_t msg = 0; msg < temp_messages.size(); ++msg)
|
||||||
{
|
{
|
||||||
if(temp_messages[msg]->level <= loglevel)
|
if(temp_messages[msg]->level <= loglevel || temp_messages[msg]->level == LL_DIALOG)
|
||||||
{
|
{
|
||||||
// Put the timestamp here
|
// Put the timestamp here
|
||||||
std::chrono::milliseconds counter = std::chrono::duration_cast<std::chrono::milliseconds>(temp_messages[msg]->counted_second);
|
std::chrono::milliseconds counter = std::chrono::duration_cast<std::chrono::milliseconds>(temp_messages[msg]->counted_second);
|
||||||
|
|
@ -225,12 +225,24 @@ void LogManager::_append(const char* filename, int line, unsigned int level, con
|
||||||
mes->line = line;
|
mes->line = line;
|
||||||
mes->counted_second = std::chrono::steady_clock::now() - base_clock;
|
mes->counted_second = std::chrono::steady_clock::now() - base_clock;
|
||||||
|
|
||||||
|
/*-------------------------------------------------*\
|
||||||
|
| If this is a dialog message, call the dialog show |
|
||||||
|
| callback |
|
||||||
|
\*-------------------------------------------------*/
|
||||||
|
if(level == LL_DIALOG)
|
||||||
|
{
|
||||||
|
for(size_t idx = 0; idx < dialog_show_callbacks.size(); idx++)
|
||||||
|
{
|
||||||
|
dialog_show_callbacks[idx](dialog_show_callback_args[idx], mes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------*\
|
/*-------------------------------------------------*\
|
||||||
| If the message is within the current verbosity, |
|
| If the message is within the current verbosity, |
|
||||||
| print it on the screen |
|
| print it on the screen |
|
||||||
| TODO: Put the timestamp here |
|
| TODO: Put the timestamp here |
|
||||||
\*-------------------------------------------------*/
|
\*-------------------------------------------------*/
|
||||||
if(level <= verbosity)
|
if(level <= verbosity || level == LL_DIALOG)
|
||||||
{
|
{
|
||||||
std::cout << mes->buffer;
|
std::cout << mes->buffer;
|
||||||
if(print_source)
|
if(print_source)
|
||||||
|
|
@ -254,21 +266,6 @@ void LogManager::_append(const char* filename, int line, unsigned int level, con
|
||||||
| Flush the queues |
|
| Flush the queues |
|
||||||
\*-------------------------------------------------*/
|
\*-------------------------------------------------*/
|
||||||
_flush();
|
_flush();
|
||||||
|
|
||||||
/*-------------------------------------------------*\
|
|
||||||
| If the message level is LL_WARNING or lower, add |
|
|
||||||
| it to the error queue |
|
|
||||||
| |
|
|
||||||
| Commented out - It is causing OpenRGB to crash |
|
|
||||||
| according to #1537 |
|
|
||||||
\*-------------------------------------------------*/
|
|
||||||
//if(level <= LL_WARNING)
|
|
||||||
//{
|
|
||||||
// for(size_t idx = 0; idx < error_callbacks.size(); ++idx)
|
|
||||||
// {
|
|
||||||
// error_callbacks[idx].first(error_callbacks[idx].second, mes);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<PLogMessage> LogManager::messages()
|
std::vector<PLogMessage> LogManager::messages()
|
||||||
|
|
@ -337,22 +334,21 @@ void LogManager::setPrintSource(bool v)
|
||||||
print_source = v;
|
print_source = v;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LogManager::registerErrorCallback(LogErrorCallback callback, void* receiver)
|
void LogManager::RegisterDialogShowCallback(LogDialogShowCallback callback, void* receiver)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> grd(entry_mutex);
|
LOG_DEBUG("dialog show callback registered");
|
||||||
|
dialog_show_callbacks.push_back(callback);
|
||||||
error_callbacks.push_back(LogErrorBlock(callback, receiver));
|
dialog_show_callback_args.push_back(receiver);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LogManager::unregisterErrorCallback(LogErrorCallback callback, void* receiver)
|
void LogManager::UnregisterDialogShowCallback(LogDialogShowCallback callback, void* receiver)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> grd(entry_mutex);
|
for(size_t idx = 0; idx < dialog_show_callbacks.size(); idx++)
|
||||||
|
|
||||||
for(size_t idx = 0; idx < error_callbacks.size(); ++idx)
|
|
||||||
{
|
{
|
||||||
if(error_callbacks[idx].first == callback && error_callbacks[idx].second == receiver)
|
if(dialog_show_callbacks[idx] == callback && dialog_show_callback_args[idx] == receiver)
|
||||||
{
|
{
|
||||||
error_callbacks.erase(error_callbacks.begin() + idx);
|
dialog_show_callbacks.erase(dialog_show_callbacks.begin() + idx);
|
||||||
|
dialog_show_callback_args.erase(dialog_show_callback_args.begin() + idx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
18
LogManager.h
18
LogManager.h
|
|
@ -25,7 +25,8 @@ enum
|
||||||
LL_INFO, // Initialization messages, significant actions and follow-up information
|
LL_INFO, // Initialization messages, significant actions and follow-up information
|
||||||
LL_VERBOSE, // Tracing of commands and performed actions, usually for debug purposes, comments on the higher priority messages
|
LL_VERBOSE, // Tracing of commands and performed actions, usually for debug purposes, comments on the higher priority messages
|
||||||
LL_DEBUG, // Deep tracing, "printf-style debugging" alternative, for debug purposes. Such messages should be put all over the code instead of comments
|
LL_DEBUG, // Deep tracing, "printf-style debugging" alternative, for debug purposes. Such messages should be put all over the code instead of comments
|
||||||
LL_TRACE
|
LL_TRACE,
|
||||||
|
LL_DIALOG // Log messages to be shown in a GUI dialog box
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LogMessage
|
struct LogMessage
|
||||||
|
|
@ -38,8 +39,7 @@ struct LogMessage
|
||||||
// int timestamp or float time_offset? TBD
|
// int timestamp or float time_offset? TBD
|
||||||
};
|
};
|
||||||
typedef std::shared_ptr<LogMessage> PLogMessage;
|
typedef std::shared_ptr<LogMessage> PLogMessage;
|
||||||
typedef void(*LogErrorCallback)(void*, PLogMessage);
|
typedef void(*LogDialogShowCallback)(void*, PLogMessage);
|
||||||
typedef std::pair<LogErrorCallback, void*> LogErrorBlock;
|
|
||||||
|
|
||||||
class LogManager
|
class LogManager
|
||||||
{
|
{
|
||||||
|
|
@ -52,7 +52,8 @@ private:
|
||||||
std::mutex section_mutex;
|
std::mutex section_mutex;
|
||||||
std::ofstream log_stream;
|
std::ofstream log_stream;
|
||||||
|
|
||||||
std::vector<LogErrorBlock> error_callbacks;
|
std::vector<LogDialogShowCallback> dialog_show_callbacks;
|
||||||
|
std::vector<void*> dialog_show_callback_args;
|
||||||
|
|
||||||
// A temporary log message storage to hold them until the stream opens
|
// A temporary log message storage to hold them until the stream opens
|
||||||
std::vector<PLogMessage> temp_messages;
|
std::vector<PLogMessage> temp_messages;
|
||||||
|
|
@ -86,8 +87,8 @@ public:
|
||||||
void setLoglevel(unsigned int);
|
void setLoglevel(unsigned int);
|
||||||
void setVerbosity(unsigned int);
|
void setVerbosity(unsigned int);
|
||||||
void setPrintSource(bool);
|
void setPrintSource(bool);
|
||||||
void registerErrorCallback(LogErrorCallback callback, void* receiver);
|
void RegisterDialogShowCallback(LogDialogShowCallback callback, void* receiver);
|
||||||
void unregisterErrorCallback(LogErrorCallback callback, void* receiver);
|
void UnregisterDialogShowCallback(LogDialogShowCallback callback, void* receiver);
|
||||||
unsigned int getLoglevel();
|
unsigned int getLoglevel();
|
||||||
unsigned int getVerbosity() {return verbosity;}
|
unsigned int getVerbosity() {return verbosity;}
|
||||||
void clearMessages();
|
void clearMessages();
|
||||||
|
|
@ -98,12 +99,13 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
#define LogAppend(level, ...) LogManager::get()->append(__FILE__, __LINE__, level, __VA_ARGS__)
|
#define LogAppend(level, ...) LogManager::get()->append(__FILE__, __LINE__, level, __VA_ARGS__)
|
||||||
#define LOG_FATAL(...) LogAppend(LL_FATAL, __VA_ARGS__)
|
#define LOG_FATAL(...) LogAppend(LL_FATAL, __VA_ARGS__)
|
||||||
#define LOG_ERROR(...) LogAppend(LL_ERROR, __VA_ARGS__)
|
#define LOG_ERROR(...) LogAppend(LL_ERROR, __VA_ARGS__)
|
||||||
#define LOG_WARNING(...) LogAppend(LL_WARNING, __VA_ARGS__)
|
#define LOG_WARNING(...) LogAppend(LL_WARNING, __VA_ARGS__)
|
||||||
#define LOG_INFO(...) LogAppend(LL_INFO, __VA_ARGS__)
|
#define LOG_INFO(...) LogAppend(LL_INFO, __VA_ARGS__)
|
||||||
#define LOG_VERBOSE(...) LogAppend(LL_VERBOSE, __VA_ARGS__)
|
#define LOG_VERBOSE(...) LogAppend(LL_VERBOSE, __VA_ARGS__)
|
||||||
#define LOG_DEBUG(...) LogAppend(LL_DEBUG, __VA_ARGS__)
|
#define LOG_DEBUG(...) LogAppend(LL_DEBUG, __VA_ARGS__)
|
||||||
#define LOG_TRACE(...) LogAppend(LL_TRACE, __VA_ARGS__)
|
#define LOG_TRACE(...) LogAppend(LL_TRACE, __VA_ARGS__)
|
||||||
|
#define LOG_DIALOG(...) LogAppend(LL_DIALOG, __VA_ARGS__)
|
||||||
|
|
||||||
#endif // LOGMANAGER_H
|
#endif // LOGMANAGER_H
|
||||||
|
|
|
||||||
50
main.cpp
50
main.cpp
|
|
@ -18,7 +18,6 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <QMessageBox>
|
|
||||||
|
|
||||||
#include "OpenRGBDialog2.h"
|
#include "OpenRGBDialog2.h"
|
||||||
|
|
||||||
|
|
@ -147,50 +146,6 @@ bool AttemptLocalConnection()
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************************\
|
|
||||||
* *
|
|
||||||
* MessageBoxCallback *
|
|
||||||
* *
|
|
||||||
* Displays a message box when an error occurs. Only call once GUI is initialized *
|
|
||||||
* *
|
|
||||||
\******************************************************************************************/
|
|
||||||
|
|
||||||
void MessageBoxCallback(void*, PLogMessage message)
|
|
||||||
{
|
|
||||||
/*---------------------------------------------------------*\
|
|
||||||
| Create a message box |
|
|
||||||
\*---------------------------------------------------------*/
|
|
||||||
QMessageBox box;
|
|
||||||
|
|
||||||
/*---------------------------------------------------------*\
|
|
||||||
| Set the box main text to the log message text |
|
|
||||||
\*---------------------------------------------------------*/
|
|
||||||
box.setText(QString::fromStdString(message->buffer));
|
|
||||||
|
|
||||||
/*---------------------------------------------------------*\
|
|
||||||
| Set the informative text from the message information |
|
|
||||||
\*---------------------------------------------------------*/
|
|
||||||
QString info = "Occured in ";
|
|
||||||
info += message->filename;
|
|
||||||
info += " on line " + QVariant(message->line).toString();
|
|
||||||
box.setInformativeText(info);
|
|
||||||
|
|
||||||
/*---------------------------------------------------------*\
|
|
||||||
| Set the message box icon according to message level |
|
|
||||||
\*---------------------------------------------------------*/
|
|
||||||
switch(message->level)
|
|
||||||
{
|
|
||||||
case LL_FATAL: box.setIcon(QMessageBox::Critical); break;
|
|
||||||
case LL_ERROR: box.setIcon(QMessageBox::Warning); break;
|
|
||||||
case LL_WARNING: box.setIcon(QMessageBox::Information); break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------*\
|
|
||||||
| Show the message box |
|
|
||||||
\*---------------------------------------------------------*/
|
|
||||||
box.exec();
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************************************\
|
/******************************************************************************************\
|
||||||
* *
|
* *
|
||||||
* main *
|
* main *
|
||||||
|
|
@ -295,11 +250,6 @@ int main(int argc, char* argv[])
|
||||||
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||||
QApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
|
|
||||||
/*---------------------------------------------------------*\
|
|
||||||
| Register the message box callback with the log manager |
|
|
||||||
\*---------------------------------------------------------*/
|
|
||||||
LogManager::get()->registerErrorCallback(&MessageBoxCallback, nullptr);
|
|
||||||
|
|
||||||
Ui::OpenRGBDialog2 dlg;
|
Ui::OpenRGBDialog2 dlg;
|
||||||
|
|
||||||
if(ret_flags & RET_FLAG_I2C_TOOLS)
|
if(ret_flags & RET_FLAG_I2C_TOOLS)
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ void OpenRGBConsolePage::Refresh()
|
||||||
{
|
{
|
||||||
unsigned int message_level = message.get()->level;
|
unsigned int message_level = message.get()->level;
|
||||||
|
|
||||||
if(message_level <= current_level)
|
if(message_level <= current_level || message_level == LL_DIALOG)
|
||||||
{
|
{
|
||||||
log += "[";
|
log += "[";
|
||||||
log += LogManager::log_codes[message_level];
|
log += LogManager::log_codes[message_level];
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
#include "OpenRGBDialog2.h"
|
#include "OpenRGBDialog2.h"
|
||||||
|
#include "LogManager.h"
|
||||||
#include "PluginManager.h"
|
#include "PluginManager.h"
|
||||||
#include "OpenRGBDevicePage.h"
|
#include "OpenRGBDevicePage.h"
|
||||||
#include "OpenRGBDeviceInfoPage.h"
|
#include "OpenRGBDeviceInfoPage.h"
|
||||||
|
|
@ -119,6 +120,14 @@ static void DetectionEndedCallback(void * this_ptr)
|
||||||
QMetaObject::invokeMethod(this_obj, "onDetectionEnded", Qt::QueuedConnection);
|
QMetaObject::invokeMethod(this_obj, "onDetectionEnded", Qt::QueuedConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void DialogShowCallback(void * this_ptr, PLogMessage msg)
|
||||||
|
{
|
||||||
|
OpenRGBDialog2 * this_obj = (OpenRGBDialog2 *)this_ptr;
|
||||||
|
|
||||||
|
this_obj->SetDialogMessage(msg);
|
||||||
|
QMetaObject::invokeMethod(this_obj, "onShowDialogMessage", Qt::QueuedConnection);
|
||||||
|
}
|
||||||
|
|
||||||
bool OpenRGBDialog2::IsDarkTheme()
|
bool OpenRGBDialog2::IsDarkTheme()
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
@ -269,6 +278,11 @@ OpenRGBDialog2::OpenRGBDialog2(QWidget *parent) : QMainWindow(parent), ui(new Op
|
||||||
ResourceManager::get()->RegisterDeviceListChangeCallback(UpdateDeviceListCallback, this);
|
ResourceManager::get()->RegisterDeviceListChangeCallback(UpdateDeviceListCallback, this);
|
||||||
ResourceManager::get()->RegisterDetectionEndCallback(DetectionEndedCallback, this);
|
ResourceManager::get()->RegisterDetectionEndCallback(DetectionEndedCallback, this);
|
||||||
|
|
||||||
|
/*-----------------------------------------------------*\
|
||||||
|
| Register dialog show callback with log manager |
|
||||||
|
\*-----------------------------------------------------*/
|
||||||
|
LogManager::get()->RegisterDialogShowCallback(DialogShowCallback, this);
|
||||||
|
|
||||||
/*-----------------------------------------------------*\
|
/*-----------------------------------------------------*\
|
||||||
| Initialize page pointers |
|
| Initialize page pointers |
|
||||||
\*-----------------------------------------------------*/
|
\*-----------------------------------------------------*/
|
||||||
|
|
@ -1265,6 +1279,11 @@ void OpenRGBDialog2::UpdateDevicesList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OpenRGBDialog2::SetDialogMessage(PLogMessage msg)
|
||||||
|
{
|
||||||
|
dialog_message = QString::fromStdString(msg->buffer);
|
||||||
|
}
|
||||||
|
|
||||||
void OpenRGBDialog2::UpdateProfileList()
|
void OpenRGBDialog2::UpdateProfileList()
|
||||||
{
|
{
|
||||||
ProfileManager* profile_manager = ResourceManager::get()->GetProfileManager();
|
ProfileManager* profile_manager = ResourceManager::get()->GetProfileManager();
|
||||||
|
|
@ -1410,6 +1429,17 @@ void OpenRGBDialog2::on_ShowHide()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OpenRGBDialog2::onShowDialogMessage()
|
||||||
|
{
|
||||||
|
QMessageBox box;
|
||||||
|
|
||||||
|
box.setInformativeText(dialog_message);
|
||||||
|
|
||||||
|
box.exec();
|
||||||
|
|
||||||
|
dialog_message.clear();
|
||||||
|
}
|
||||||
|
|
||||||
void OpenRGBDialog2::on_ReShow(QSystemTrayIcon::ActivationReason reason)
|
void OpenRGBDialog2::on_ReShow(QSystemTrayIcon::ActivationReason reason)
|
||||||
{
|
{
|
||||||
if (reason == QSystemTrayIcon::DoubleClick)
|
if (reason == QSystemTrayIcon::DoubleClick)
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "i2c_smbus.h"
|
#include "i2c_smbus.h"
|
||||||
|
#include "LogManager.h"
|
||||||
#include "RGBController.h"
|
#include "RGBController.h"
|
||||||
#include "ProfileManager.h"
|
#include "ProfileManager.h"
|
||||||
#include "NetworkClient.h"
|
#include "NetworkClient.h"
|
||||||
|
|
@ -56,6 +57,8 @@ public:
|
||||||
static bool IsDarkTheme();
|
static bool IsDarkTheme();
|
||||||
static bool IsMinimizeOnClose();
|
static bool IsMinimizeOnClose();
|
||||||
|
|
||||||
|
void SetDialogMessage(PLogMessage msg);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*-------------------------------------*\
|
/*-------------------------------------*\
|
||||||
| Page pointers |
|
| Page pointers |
|
||||||
|
|
@ -115,6 +118,7 @@ private:
|
||||||
PluginManager* plugin_manager = nullptr;
|
PluginManager* plugin_manager = nullptr;
|
||||||
|
|
||||||
QAction* actionExit;
|
QAction* actionExit;
|
||||||
|
QString dialog_message;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void on_Exit();
|
void on_Exit();
|
||||||
|
|
@ -132,6 +136,7 @@ private slots:
|
||||||
void on_SetAllDevices(unsigned char red, unsigned char green, unsigned char blue);
|
void on_SetAllDevices(unsigned char red, unsigned char green, unsigned char blue);
|
||||||
void on_SaveSizeProfile();
|
void on_SaveSizeProfile();
|
||||||
void on_ShowHide();
|
void on_ShowHide();
|
||||||
|
void onShowDialogMessage();
|
||||||
void on_ReShow(QSystemTrayIcon::ActivationReason reason);
|
void on_ReShow(QSystemTrayIcon::ActivationReason reason);
|
||||||
void on_ProfileSelected();
|
void on_ProfileSelected();
|
||||||
void on_ButtonLoadProfile_clicked();
|
void on_ButtonLoadProfile_clicked();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue