mirror of
https://github.com/CalcProgrammer1/OpenRGB.git
synced 2025-12-23 23:37:48 -05:00
Add LL_DIALOG log level, which can trigger the GUI to show a message box containing the log message
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
|
||||
#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()
|
||||
{
|
||||
@@ -154,7 +154,7 @@ void LogManager::_flush()
|
||||
{
|
||||
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
|
||||
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->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, |
|
||||
| print it on the screen |
|
||||
| TODO: Put the timestamp here |
|
||||
\*-------------------------------------------------*/
|
||||
if(level <= verbosity)
|
||||
if(level <= verbosity || level == LL_DIALOG)
|
||||
{
|
||||
std::cout << mes->buffer;
|
||||
if(print_source)
|
||||
@@ -254,21 +266,6 @@ void LogManager::_append(const char* filename, int line, unsigned int level, con
|
||||
| Flush the queues |
|
||||
\*-------------------------------------------------*/
|
||||
_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()
|
||||
@@ -337,22 +334,21 @@ void LogManager::setPrintSource(bool 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);
|
||||
|
||||
error_callbacks.push_back(LogErrorBlock(callback, receiver));
|
||||
LOG_DEBUG("dialog show callback registered");
|
||||
dialog_show_callbacks.push_back(callback);
|
||||
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 < error_callbacks.size(); ++idx)
|
||||
for(size_t idx = 0; idx < dialog_show_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_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_TRACE
|
||||
LL_TRACE,
|
||||
LL_DIALOG // Log messages to be shown in a GUI dialog box
|
||||
};
|
||||
|
||||
struct LogMessage
|
||||
@@ -38,8 +39,7 @@ struct LogMessage
|
||||
// int timestamp or float time_offset? TBD
|
||||
};
|
||||
typedef std::shared_ptr<LogMessage> PLogMessage;
|
||||
typedef void(*LogErrorCallback)(void*, PLogMessage);
|
||||
typedef std::pair<LogErrorCallback, void*> LogErrorBlock;
|
||||
typedef void(*LogDialogShowCallback)(void*, PLogMessage);
|
||||
|
||||
class LogManager
|
||||
{
|
||||
@@ -52,7 +52,8 @@ private:
|
||||
std::mutex section_mutex;
|
||||
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
|
||||
std::vector<PLogMessage> temp_messages;
|
||||
@@ -86,8 +87,8 @@ public:
|
||||
void setLoglevel(unsigned int);
|
||||
void setVerbosity(unsigned int);
|
||||
void setPrintSource(bool);
|
||||
void registerErrorCallback(LogErrorCallback callback, void* receiver);
|
||||
void unregisterErrorCallback(LogErrorCallback callback, void* receiver);
|
||||
void RegisterDialogShowCallback(LogDialogShowCallback callback, void* receiver);
|
||||
void UnregisterDialogShowCallback(LogDialogShowCallback callback, void* receiver);
|
||||
unsigned int getLoglevel();
|
||||
unsigned int getVerbosity() {return verbosity;}
|
||||
void clearMessages();
|
||||
@@ -98,12 +99,13 @@ public:
|
||||
};
|
||||
|
||||
#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_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_DEBUG(...) LogAppend(LL_DEBUG, __VA_ARGS__)
|
||||
#define LOG_TRACE(...) LogAppend(LL_TRACE, __VA_ARGS__)
|
||||
#define LOG_DIALOG(...) LogAppend(LL_DIALOG, __VA_ARGS__)
|
||||
|
||||
#endif // LOGMANAGER_H
|
||||
|
||||
50
main.cpp
50
main.cpp
@@ -18,7 +18,6 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <thread>
|
||||
#include <QMessageBox>
|
||||
|
||||
#include "OpenRGBDialog2.h"
|
||||
|
||||
@@ -147,50 +146,6 @@ bool AttemptLocalConnection()
|
||||
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 *
|
||||
@@ -295,11 +250,6 @@ int main(int argc, char* argv[])
|
||||
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||
QApplication a(argc, argv);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Register the message box callback with the log manager |
|
||||
\*---------------------------------------------------------*/
|
||||
LogManager::get()->registerErrorCallback(&MessageBoxCallback, nullptr);
|
||||
|
||||
Ui::OpenRGBDialog2 dlg;
|
||||
|
||||
if(ret_flags & RET_FLAG_I2C_TOOLS)
|
||||
|
||||
@@ -37,7 +37,7 @@ void OpenRGBConsolePage::Refresh()
|
||||
{
|
||||
unsigned int message_level = message.get()->level;
|
||||
|
||||
if(message_level <= current_level)
|
||||
if(message_level <= current_level || message_level == LL_DIALOG)
|
||||
{
|
||||
log += "[";
|
||||
log += LogManager::log_codes[message_level];
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#include "OpenRGBDialog2.h"
|
||||
#include "LogManager.h"
|
||||
#include "PluginManager.h"
|
||||
#include "OpenRGBDevicePage.h"
|
||||
#include "OpenRGBDeviceInfoPage.h"
|
||||
@@ -119,6 +120,14 @@ static void DetectionEndedCallback(void * this_ptr)
|
||||
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()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
@@ -269,6 +278,11 @@ OpenRGBDialog2::OpenRGBDialog2(QWidget *parent) : QMainWindow(parent), ui(new Op
|
||||
ResourceManager::get()->RegisterDeviceListChangeCallback(UpdateDeviceListCallback, this);
|
||||
ResourceManager::get()->RegisterDetectionEndCallback(DetectionEndedCallback, this);
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Register dialog show callback with log manager |
|
||||
\*-----------------------------------------------------*/
|
||||
LogManager::get()->RegisterDialogShowCallback(DialogShowCallback, this);
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Initialize page pointers |
|
||||
\*-----------------------------------------------------*/
|
||||
@@ -1265,6 +1279,11 @@ void OpenRGBDialog2::UpdateDevicesList()
|
||||
}
|
||||
}
|
||||
|
||||
void OpenRGBDialog2::SetDialogMessage(PLogMessage msg)
|
||||
{
|
||||
dialog_message = QString::fromStdString(msg->buffer);
|
||||
}
|
||||
|
||||
void OpenRGBDialog2::UpdateProfileList()
|
||||
{
|
||||
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)
|
||||
{
|
||||
if (reason == QSystemTrayIcon::DoubleClick)
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
#include <vector>
|
||||
#include "i2c_smbus.h"
|
||||
#include "LogManager.h"
|
||||
#include "RGBController.h"
|
||||
#include "ProfileManager.h"
|
||||
#include "NetworkClient.h"
|
||||
@@ -56,6 +57,8 @@ public:
|
||||
static bool IsDarkTheme();
|
||||
static bool IsMinimizeOnClose();
|
||||
|
||||
void SetDialogMessage(PLogMessage msg);
|
||||
|
||||
private:
|
||||
/*-------------------------------------*\
|
||||
| Page pointers |
|
||||
@@ -115,6 +118,7 @@ private:
|
||||
PluginManager* plugin_manager = nullptr;
|
||||
|
||||
QAction* actionExit;
|
||||
QString dialog_message;
|
||||
|
||||
private slots:
|
||||
void on_Exit();
|
||||
@@ -132,6 +136,7 @@ private slots:
|
||||
void on_SetAllDevices(unsigned char red, unsigned char green, unsigned char blue);
|
||||
void on_SaveSizeProfile();
|
||||
void on_ShowHide();
|
||||
void onShowDialogMessage();
|
||||
void on_ReShow(QSystemTrayIcon::ActivationReason reason);
|
||||
void on_ProfileSelected();
|
||||
void on_ButtonLoadProfile_clicked();
|
||||
|
||||
Reference in New Issue
Block a user