waycast/lib/plugins/PluginManager.hpp
2025-08-28 17:03:32 -04:00

77 lines
2.1 KiB
C++

#pragma once
#include "PluginInterface.hpp"
#include "../ui/ListItem.hpp"
#include <vector>
#include <memory>
#include <algorithm>
namespace plugins
{
class PluginManager
{
public:
static PluginManager& instance()
{
static PluginManager instance;
return instance;
}
void registerPlugin(SearchPluginPtr plugin)
{
if (plugin && plugin->isEnabled())
{
m_plugins.push_back(std::move(plugin));
// Sort plugins by priority (higher priority first)
std::sort(m_plugins.begin(), m_plugins.end(),
[](const SearchPluginPtr& a, const SearchPluginPtr& b) {
return a->priority() > b->priority();
});
}
}
std::vector<ListItemPtr> search(const QString& query)
{
std::vector<ListItemPtr> allResults;
for (const auto& plugin : m_plugins)
{
if (query.isEmpty())
{
auto items = plugin->getAllItems();
allResults.insert(allResults.end(), items.begin(), items.end());
}
else
{
auto results = plugin->search(query);
allResults.insert(allResults.end(), results.begin(), results.end());
}
}
return allResults;
}
std::vector<ListItemPtr> getAllItems()
{
std::vector<ListItemPtr> allItems;
for (const auto& plugin : m_plugins)
{
auto items = plugin->getAllItems();
allItems.insert(allItems.end(), items.begin(), items.end());
}
return allItems;
}
const std::vector<SearchPluginPtr>& getPlugins() const
{
return m_plugins;
}
private:
PluginManager() = default;
std::vector<SearchPluginPtr> m_plugins;
};
}