diff options
author | Aqua-sama <aqua@iserlohn-fortress.net> | 2018-05-16 18:20:25 +0200 |
---|---|---|
committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2018-05-16 18:20:25 +0200 |
commit | 6d095aca7f59dff26df0e2b5283d926feff5b477 (patch) | |
tree | da26b56719aefee7eec5b81a47b6b6ad49125437 | |
parent | Move help and version functions to main (out of Configuration) (diff) | |
download | smolbote-6d095aca7f59dff26df0e2b5283d926feff5b477.tar.xz |
Plugin command-line parameters
-rw-r--r-- | lib/configuration/configuration.cpp | 3 | ||||
-rw-r--r-- | plugins/ProfileEditor/profileeditorplugin.cpp | 10 | ||||
-rw-r--r-- | plugins/ProfileEditor/profileeditorplugin.h | 1 | ||||
-rw-r--r-- | plugins/interfaces.h | 3 | ||||
-rw-r--r-- | src/browser.cpp | 17 | ||||
-rw-r--r-- | src/browser.h | 8 | ||||
-rw-r--r-- | src/main.cpp | 16 |
7 files changed, 55 insertions, 3 deletions
diff --git a/lib/configuration/configuration.cpp b/lib/configuration/configuration.cpp index def997d..f2ec417 100644 --- a/lib/configuration/configuration.cpp +++ b/lib/configuration/configuration.cpp @@ -50,6 +50,9 @@ Configuration::Configuration() ("config,c", po::value<std::string>()->default_value(defaultUserConfigLocation()), "Set the configuration file.") ("socket,s", po::value<std::string>()->default_value(defaultSocketPath()), "Local server socket") + ("command", po::value<std::string>(), "Run a plugin command") + ("commands", "List all plugin commands") + ("url", po::value<std::vector<std::string>>(), "URLs") ; diff --git a/plugins/ProfileEditor/profileeditorplugin.cpp b/plugins/ProfileEditor/profileeditorplugin.cpp index 7a92e51..fc65350 100644 --- a/plugins/ProfileEditor/profileeditorplugin.cpp +++ b/plugins/ProfileEditor/profileeditorplugin.cpp @@ -8,6 +8,16 @@ #include "profileeditorplugin.h" #include "forms/profileview.h" +#include <QHash> + +QHash<QString, std::function<void()>> ProfileEditorPlugin::commands() +{ + QHash<QString, std::function<void()>> hash; + hash.insert("profileEditor:about", []() { + qDebug("ProfileEditor for smolbote"); + }); + return hash; +} QDialog *ProfileEditorPlugin::createWidget(QWebEngineProfile *profile, QWidget *parent) { diff --git a/plugins/ProfileEditor/profileeditorplugin.h b/plugins/ProfileEditor/profileeditorplugin.h index 899c51a..88a0783 100644 --- a/plugins/ProfileEditor/profileeditorplugin.h +++ b/plugins/ProfileEditor/profileeditorplugin.h @@ -21,6 +21,7 @@ class ProfileEditorPlugin : public QObject, public PluginInterface, public Profi public: // PluginInterface + QHash<QString, std::function<void()>> commands() override; // ProfileInterface QDialog *createWidget(QWebEngineProfile *profile, QWidget *parent) override; diff --git a/plugins/interfaces.h b/plugins/interfaces.h index 46cf24a..ad3df97 100644 --- a/plugins/interfaces.h +++ b/plugins/interfaces.h @@ -11,6 +11,7 @@ #include <QtPlugin> #include <memory> +#include <functional> class QString; class QAction; @@ -26,13 +27,13 @@ class PluginInterface { public: virtual ~PluginInterface() = default; + virtual QHash<QString, std::function<void()>> commands() = 0; }; class ProfileInterface { public: virtual ~ProfileInterface() = default; - virtual QDialog *createWidget(QWebEngineProfile *profile, QWidget *parent) = 0; }; diff --git a/src/browser.cpp b/src/browser.cpp index 09db2d1..91ba4f8 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -82,6 +82,14 @@ void Browser::setup(const QString &defaultProfile) // plugins m_plugins.append(loadPlugins(QString::fromStdString(m_config->value<std::string>("plugins.path").value()))); + // register commands + for(Plugin p : m_plugins) { + auto *plugin = qobject_cast<PluginInterface *>(p.instance.get()); + if(plugin) { + m_commands.unite(plugin->commands()); + } + } + // url request filter m_urlFilter = std::make_shared<UrlRequestInterceptor>(QString::fromStdString(m_config->value<std::string>("filter.path").value())); @@ -113,6 +121,15 @@ void Browser::setup(const QString &defaultProfile) } } +void Browser::command(const QString &command) +{ + if(m_commands.contains(command)) { + m_commands.value(command)(); + } else { + qWarning("No such command: %s", qUtf8Printable(command)); + } +} + void Browser::createSession(const QString &profileName, bool newWindow, const QStringList &urls) { if(m_windows.isEmpty()) { diff --git a/src/browser.h b/src/browser.h index 01de9bb..e5df9de 100644 --- a/src/browser.h +++ b/src/browser.h @@ -14,6 +14,7 @@ #include <QVector> #include <memory> #include <interfaces.h> +#include <functional> QVector<Plugin> loadPlugins(const QString &location); @@ -34,6 +35,12 @@ public: void setConfiguration(std::shared_ptr<Configuration> &config); void setup(const QString &defaultProfile); + void command(const QString &command); + QStringList commands() const + { + return m_commands.keys(); + } + public slots: void createSession(const QString &profileName, bool newWindow, const QStringList &urls); MainWindow *createWindow(); @@ -46,6 +53,7 @@ private: QVector<MainWindow *> m_windows; QVector<Plugin> m_plugins; + QHash<QString, std::function<void()>> m_commands; }; #endif // SMOLBOTE_BROWSER_H diff --git a/src/main.cpp b/src/main.cpp index f1ac1ae..d578d24 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -49,6 +49,20 @@ int main(int argc, char **argv) app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true); app.setConfiguration(config); + app.setup(QString::fromStdString(config->value<std::string>("profile.default").value())); + + if(config->exists("commands")) { + for(const QString &cmd : app.commands()) { + std::cout << cmd.toStdString() << std::endl; + } + return 0; + } + + if(config->exists("command")) { + app.command(QString::fromStdString(config->value<std::string>("command").value())); + return 0; + } + // set up socket bool isSingleInstance = app.bindLocalSocket(QString::fromStdString(config->value<std::string>("socket").value())); #ifdef QT_DEBUG @@ -66,12 +80,10 @@ int main(int argc, char **argv) } } - app.setup(QString::fromStdString(config->value<std::string>("profile.default").value())); QObject::connect(&app, &Browser::messageAvailable, &app, &Browser::createSession); } app.sendMessage("", false, config->positionalArguments()); - if(isSingleInstance) return app.exec(); else |