diff --git a/addon.cpp b/addon.cpp index 3cda1fa..1d4cb7f 100644 --- a/addon.cpp +++ b/addon.cpp @@ -580,6 +580,20 @@ void Addon::setReadme(QString readme) emit readmeChanged(m_readme); } +QFuture Addon::updateIfBehind() +{ + std::shared_ptr> p(new QPromise()); + delegate("UpdateIfBehind", [this](){ + },[this, p](){ + if (m_gitStatus == Addon::GitStatusFlag::Behind) + update(); + delegate("Finished", [p](){ + p->finish(); + }); + }); + return p->future(); +} + QStringList Addon::branches() const { return m_branches; diff --git a/addon.h b/addon.h index 690031f..eeee472 100644 --- a/addon.h +++ b/addon.h @@ -26,6 +26,7 @@ #include #include "utils.h" #include +#include class git_repository; class git_reference; @@ -209,6 +210,7 @@ public slots: void reclone(); void loadReadme(); void setReadme(QString readme); + QFuture updateIfBehind(); }; Q_DECLARE_OPERATORS_FOR_FLAGS(Addon::GitStatus) diff --git a/control.cpp b/control.cpp index c0f785e..1eadd32 100644 --- a/control.cpp +++ b/control.cpp @@ -766,3 +766,19 @@ void Control::log(QtMsgType type, const QMessageLogContext& context, const QStri emit logMessage(message.arg(color, msg)); } +void Control::updateAllAndClose() +{ + delegate("UpdateAllAndClose", [](){ + },[this](){ + std::vector> futs(m_addons.size()); + foreach (auto addon, m_addons) { + futs.push_back(addon->updateIfBehind()); + } + delegate("WaitForFinish", [this, futs](){ + foreach(auto fut, futs) + fut.waitForFinished(); + QApplication::quit(); + }); + }); +} + diff --git a/control.h b/control.h index ec2a096..f1e61d5 100644 --- a/control.h +++ b/control.h @@ -151,6 +151,8 @@ public: void log(QtMsgType type, const QMessageLogContext &context, const QString &msg); + void updateAllAndClose(); + private: static Control *m_instance; explicit Control(QObject *parent = nullptr); diff --git a/main.cpp b/main.cpp index d13aab2..6c9b052 100644 --- a/main.cpp +++ b/main.cpp @@ -51,6 +51,7 @@ int main(int argc, char *argv[]) QCommandLineParser parser; parser.addOption({"update", "directory to update", "updateLocation"}); + parser.addOption({"oneshot", "Updates all addons and exits"}); parser.process(app); QString update = parser.value("update"); app.setApplicationDisplayName(QObject::tr("Git Addons Manager")); @@ -80,9 +81,7 @@ int main(int argc, char *argv[]) setts.setValue("style", style); setts.sync(); } - qmlRegisterSingletonType("GitAddonsManager.engine",1,0,"Engine",[](QQmlEngine *, QJSEngine *)->QObject*{ - return Control::instance(); - }); + qmlRegisterSingletonInstance("GitAddonsManager.engine",1,0,"Engine", Control::instance()); if (!update.isEmpty()) { Control::instance()->completeUpdate(update); engine.load(QUrl(QStringLiteral("qrc:/Update.qml"))); @@ -90,6 +89,10 @@ int main(int argc, char *argv[]) Control::instance()->init(); qmlRegisterUncreatableType("GitAddonsManager.engine",1,0,"Addon",""); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + if (parser.isSet("oneshot")) { + QMetaObject::invokeMethod(Control::instance(), &Control::updateAllAndClose, Qt::QueuedConnection); + } + } if (engine.rootObjects().isEmpty()) return -1;