Add GetTrayMenu to plugin API to provide a dedicated interface for registering a tray menu for a plugin

This commit is contained in:
Adam Honse 2021-08-29 22:43:39 -05:00
parent 2f25c4af7f
commit 2800e76e9d
5 changed files with 54 additions and 36 deletions

View file

@ -13,6 +13,7 @@
#include <QtPlugin> #include <QtPlugin>
#include <QLabel> #include <QLabel>
#include <QMenu>
#define OpenRGBPluginInterface_IID "com.OpenRGBPluginInterface" #define OpenRGBPluginInterface_IID "com.OpenRGBPluginInterface"
@ -68,6 +69,7 @@ public:
\*-------------------------------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------------------------------*/
virtual void Load(bool dark_theme, ResourceManager* resource_manager_ptr) = 0; virtual void Load(bool dark_theme, ResourceManager* resource_manager_ptr) = 0;
virtual QWidget* GetWidget() = 0; virtual QWidget* GetWidget() = 0;
virtual QMenu* GetTrayMenu() = 0;
virtual void Unload() = 0; virtual void Unload() = 0;
}; };

View file

@ -6,23 +6,23 @@ PluginManager::PluginManager(bool dark_theme_val)
/*---------------------------------------------------------*\ /*---------------------------------------------------------*\
| Initialize plugin manager class variables | | Initialize plugin manager class variables |
\*---------------------------------------------------------*/ \*---------------------------------------------------------*/
dark_theme = dark_theme_val; dark_theme = dark_theme_val;
AddPluginTabCallbackVal = nullptr; AddPluginCallbackVal = nullptr;
AddPluginTabCallbackArg = nullptr; AddPluginCallbackArg = nullptr;
RemovePluginTabCallbackVal = nullptr; RemovePluginCallbackVal = nullptr;
RemovePluginTabCallbackArg = nullptr; RemovePluginCallbackArg = nullptr;
} }
void PluginManager::RegisterAddPluginTabCallback(AddPluginTabCallback new_callback, void * new_callback_arg) void PluginManager::RegisterAddPluginCallback(AddPluginCallback new_callback, void * new_callback_arg)
{ {
AddPluginTabCallbackVal = new_callback; AddPluginCallbackVal = new_callback;
AddPluginTabCallbackArg = new_callback_arg; AddPluginCallbackArg = new_callback_arg;
} }
void PluginManager::RegisterRemovePluginTabCallback(RemovePluginTabCallback new_callback, void * new_callback_arg) void PluginManager::RegisterRemovePluginCallback(RemovePluginCallback new_callback, void * new_callback_arg)
{ {
RemovePluginTabCallbackVal = new_callback; RemovePluginCallbackVal = new_callback;
RemovePluginTabCallbackArg = new_callback_arg; RemovePluginCallbackArg = new_callback_arg;
} }
void PluginManager::ScanAndLoadPlugins() void PluginManager::ScanAndLoadPlugins()
@ -272,11 +272,11 @@ void PluginManager::LoadPlugin(std::string path)
plugin->Load(dark_theme, ResourceManager::get()); plugin->Load(dark_theme, ResourceManager::get());
/*-------------------------------------------------*\ /*-------------------------------------------------*\
| Call the Add Plugin Tab callback | | Call the Add Plugin callback |
\*-------------------------------------------------*/ \*-------------------------------------------------*/
if(AddPluginTabCallbackArg != nullptr) if(AddPluginCallbackArg != nullptr)
{ {
AddPluginTabCallbackVal(AddPluginTabCallbackArg, &ActivePlugins[plugin_idx]); AddPluginCallbackVal(AddPluginCallbackArg, &ActivePlugins[plugin_idx]);
} }
} }
} }
@ -318,11 +318,11 @@ void PluginManager::UnloadPlugin(std::string path)
ActivePlugins[plugin_idx].plugin->Unload(); ActivePlugins[plugin_idx].plugin->Unload();
/*-------------------------------------------------*\ /*-------------------------------------------------*\
| Call the Remove Plugin Tab callback | | Call the Remove Plugin callback |
\*-------------------------------------------------*/ \*-------------------------------------------------*/
if(RemovePluginTabCallbackVal != nullptr) if(RemovePluginCallbackVal != nullptr)
{ {
RemovePluginTabCallbackVal(RemovePluginTabCallbackArg, &ActivePlugins[plugin_idx]); RemovePluginCallbackVal(RemovePluginCallbackArg, &ActivePlugins[plugin_idx]);
} }
ActivePlugins[plugin_idx].loader->unload(); ActivePlugins[plugin_idx].loader->unload();

View file

@ -18,20 +18,21 @@ typedef struct
QPluginLoader* loader; QPluginLoader* loader;
bool loaded; bool loaded;
QWidget* widget; QWidget* widget;
QMenu* traymenu;
std::string path; std::string path;
bool enabled; bool enabled;
} OpenRGBPluginEntry; } OpenRGBPluginEntry;
typedef void (*AddPluginTabCallback)(void *, OpenRGBPluginEntry* plugin); typedef void (*AddPluginCallback)(void *, OpenRGBPluginEntry* plugin);
typedef void (*RemovePluginTabCallback)(void *, OpenRGBPluginEntry* plugin); typedef void (*RemovePluginCallback)(void *, OpenRGBPluginEntry* plugin);
class PluginManager class PluginManager
{ {
public: public:
PluginManager(bool dark_theme); PluginManager(bool dark_theme);
void RegisterAddPluginTabCallback(AddPluginTabCallback new_callback, void * new_callback_arg); void RegisterAddPluginCallback(AddPluginCallback new_callback, void * new_callback_arg);
void RegisterRemovePluginTabCallback(RemovePluginTabCallback new_callback, void * new_callback_arg); void RegisterRemovePluginCallback(RemovePluginCallback new_callback, void * new_callback_arg);
void ScanAndLoadPlugins(); void ScanAndLoadPlugins();
@ -46,9 +47,9 @@ public:
private: private:
bool dark_theme; bool dark_theme;
AddPluginTabCallback AddPluginTabCallbackVal; AddPluginCallback AddPluginCallbackVal;
void * AddPluginTabCallbackArg; void * AddPluginCallbackArg;
RemovePluginTabCallback RemovePluginTabCallbackVal; RemovePluginCallback RemovePluginCallbackVal;
void * RemovePluginTabCallbackArg; void * RemovePluginCallbackArg;
}; };

View file

@ -96,18 +96,18 @@ static void UpdateDetectionProgressCallback(void * this_ptr)
QMetaObject::invokeMethod(this_obj, "onDetectionProgressUpdated", Qt::QueuedConnection); QMetaObject::invokeMethod(this_obj, "onDetectionProgressUpdated", Qt::QueuedConnection);
} }
static void CreatePluginTabCallback(void * this_ptr, OpenRGBPluginEntry* plugin) static void CreatePluginCallback(void * this_ptr, OpenRGBPluginEntry* plugin)
{ {
OpenRGBDialog2 * this_obj = (OpenRGBDialog2 *)this_ptr; OpenRGBDialog2 * this_obj = (OpenRGBDialog2 *)this_ptr;
this_obj->AddPluginTab(plugin); this_obj->AddPlugin(plugin);
} }
static void DeletePluginTabCallback(void * this_ptr, OpenRGBPluginEntry* plugin) static void DeletePluginCallback(void * this_ptr, OpenRGBPluginEntry* plugin)
{ {
OpenRGBDialog2 * this_obj = (OpenRGBDialog2 *)this_ptr; OpenRGBDialog2 * this_obj = (OpenRGBDialog2 *)this_ptr;
this_obj->RemovePluginTab(plugin); this_obj->RemovePlugin(plugin);
} }
bool OpenRGBDialog2::IsDarkTheme() bool OpenRGBDialog2::IsDarkTheme()
@ -286,7 +286,7 @@ OpenRGBDialog2::OpenRGBDialog2(QWidget *parent) : QMainWindow(parent), ui(new Op
/*-----------------------------------------------------*\ /*-----------------------------------------------------*\
| Set up tray icon menu | | Set up tray icon menu |
\*-----------------------------------------------------*/ \*-----------------------------------------------------*/
QMenu* trayIconMenu = new QMenu( this ); trayIconMenu = new QMenu( this );
trayIcon = new QSystemTrayIcon(this); trayIcon = new QSystemTrayIcon(this);
@ -420,8 +420,8 @@ OpenRGBDialog2::OpenRGBDialog2(QWidget *parent) : QMainWindow(parent), ui(new Op
| Initialize the plugin manager | | Initialize the plugin manager |
\*-----------------------------------------------------*/ \*-----------------------------------------------------*/
plugin_manager = new PluginManager(IsDarkTheme()); plugin_manager = new PluginManager(IsDarkTheme());
plugin_manager->RegisterAddPluginTabCallback(&CreatePluginTabCallback, this); plugin_manager->RegisterAddPluginCallback(&CreatePluginCallback, this);
plugin_manager->RegisterRemovePluginTabCallback(&DeletePluginTabCallback, this); plugin_manager->RegisterRemovePluginCallback(&DeletePluginCallback, this);
plugin_manager->ScanAndLoadPlugins(); plugin_manager->ScanAndLoadPlugins();
/*-----------------------------------------------------*\ /*-----------------------------------------------------*\
@ -698,7 +698,7 @@ void OpenRGBDialog2::AddSerialSettingsPage()
ui->SettingsTabBar->tabBar()->setTabButton(ui->SettingsTabBar->tabBar()->count() - 1, QTabBar::LeftSide, SettingsTabLabel); ui->SettingsTabBar->tabBar()->setTabButton(ui->SettingsTabBar->tabBar()->count() - 1, QTabBar::LeftSide, SettingsTabLabel);
} }
void OpenRGBDialog2::AddPluginTab(OpenRGBPluginEntry* plugin) void OpenRGBDialog2::AddPlugin(OpenRGBPluginEntry* plugin)
{ {
/*-----------------------------------------------------*\ /*-----------------------------------------------------*\
| Create Label for the Tab | | Create Label for the Tab |
@ -791,9 +791,18 @@ void OpenRGBDialog2::AddPluginTab(OpenRGBPluginEntry* plugin)
{ {
std::cout << ("Cannot load plugin '" + plugin->info.Name + "' as it does not specify a valid location.\n"); std::cout << ("Cannot load plugin '" + plugin->info.Name + "' as it does not specify a valid location.\n");
} }
QMenu* NewTrayMenu = plugin->plugin->GetTrayMenu();
plugin->traymenu = NewTrayMenu;
if(NewTrayMenu)
{
trayIconMenu->addMenu(NewTrayMenu);
}
} }
void OpenRGBDialog2::RemovePluginTab(OpenRGBPluginEntry* plugin) void OpenRGBDialog2::RemovePlugin(OpenRGBPluginEntry* plugin)
{ {
/*-----------------------------------------------------*\ /*-----------------------------------------------------*\
| Place plugin as its own top level tab | | Place plugin as its own top level tab |
@ -863,6 +872,11 @@ void OpenRGBDialog2::RemovePluginTab(OpenRGBPluginEntry* plugin)
} }
} }
} }
if(plugin->traymenu)
{
trayIconMenu->removeAction(plugin->traymenu->menuAction());
}
} }
void OpenRGBDialog2::AddI2CToolsPage() void OpenRGBDialog2::AddI2CToolsPage()

View file

@ -45,8 +45,8 @@ public:
void AddI2CToolsPage(); void AddI2CToolsPage();
void AddServerTab(); void AddServerTab();
void AddPluginTab(OpenRGBPluginEntry* plugin); void AddPlugin(OpenRGBPluginEntry* plugin);
void RemovePluginTab(OpenRGBPluginEntry* plugin); void RemovePlugin(OpenRGBPluginEntry* plugin);
void setMode(unsigned char mode_val); void setMode(unsigned char mode_val);
@ -73,6 +73,7 @@ private:
| System tray icon and menu | | System tray icon and menu |
\*-------------------------------------*/ \*-------------------------------------*/
QSystemTrayIcon* trayIcon; QSystemTrayIcon* trayIcon;
QMenu* trayIconMenu;
QMenu* profileMenu; QMenu* profileMenu;
/*-------------------------------------*\ /*-------------------------------------*\