From 46fb63e960fc52ac4da5c4205b12d8d6feb29360 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Wed, 16 Nov 2022 22:03:33 +0100 Subject: [PATCH] Add option to set working directory for new process --- data/locale/en-US.ini | 1 + src/macro-core/macro-action-run.cpp | 51 ++++++++++++++++++++++------- src/macro-core/macro-action-run.hpp | 3 ++ 3 files changed, 43 insertions(+), 12 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 80a5d4d0..428a346b 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -413,6 +413,7 @@ AdvSceneSwitcher.action.run.arguments="Arguments:" AdvSceneSwitcher.action.run.addArgument="Add argument" AdvSceneSwitcher.action.run.addArgumentDescription="Add new argument:" AdvSceneSwitcher.action.run.entry="Run {{filePath}}" +AdvSceneSwitcher.action.run.entry.workingDirectory="Working directory:{{workingDirectory}}" AdvSceneSwitcher.action.sceneVisibility="Scene item visibility" AdvSceneSwitcher.action.sceneVisibility.type.show="Show" AdvSceneSwitcher.action.sceneVisibility.type.hide="Hide" diff --git a/src/macro-core/macro-action-run.cpp b/src/macro-core/macro-action-run.cpp index 2b929ed6..1882a624 100644 --- a/src/macro-core/macro-action-run.cpp +++ b/src/macro-core/macro-action-run.cpp @@ -15,7 +15,9 @@ bool MacroActionRun::_registered = MacroActionFactory::Register( bool MacroActionRun::PerformAction() { - if (!QProcess::startDetached(QString::fromStdString(_path), _args) && + if (!QProcess::startDetached( + QString::fromStdString(_path), _args, + QString::fromStdString(_workingDirectory)) && _args.empty()) { vblog(LOG_INFO, "run \"%s\" using QDesktopServices", _path.c_str()); @@ -34,6 +36,7 @@ bool MacroActionRun::Save(obs_data_t *obj) { MacroAction::Save(obj); obs_data_set_string(obj, "path", _path.c_str()); + obs_data_set_string(obj, "workingDirectory", _workingDirectory.c_str()); obs_data_array_t *args = obs_data_array_create(); for (auto &arg : _args) { obs_data_t *array_obj = obs_data_create(); @@ -51,6 +54,7 @@ bool MacroActionRun::Load(obs_data_t *obj) { MacroAction::Load(obj); _path = obs_data_get_string(obj, "path"); + _workingDirectory = obs_data_get_string(obj, "workingDirectory"); obs_data_array_t *args = obs_data_get_array(obj, "args"); size_t count = obs_data_array_count(args); for (size_t i = 0; i < count; i++) { @@ -70,26 +74,27 @@ std::string MacroActionRun::GetShortDesc() MacroActionRunEdit::MacroActionRunEdit( QWidget *parent, std::shared_ptr entryData) - : QWidget(parent) + : QWidget(parent), + _filePath(new FileSelection()), + _argList(new QListWidget()), + _addArg(new QPushButton()), + _removeArg(new QPushButton()), + _argUp(new QPushButton()), + _argDown(new QPushButton()), + _workingDirectory(new FileSelection(FileSelection::Type::FOLDER)) { - _filePath = new FileSelection(); - _argList = new QListWidget(); - _addArg = new QPushButton(); _addArg->setMaximumWidth(22); _addArg->setProperty("themeID", QVariant(QString::fromUtf8("addIconSmall"))); _addArg->setFlat(true); - _removeArg = new QPushButton(); _removeArg->setMaximumWidth(22); _removeArg->setProperty("themeID", QVariant(QString::fromUtf8("removeIconSmall"))); _removeArg->setFlat(true); - _argUp = new QPushButton(); _argUp->setMaximumWidth(22); _argUp->setProperty("themeID", QVariant(QString::fromUtf8("upArrowIconSmall"))); _argUp->setFlat(true); - _argDown = new QPushButton(); _argDown->setMaximumWidth(22); _argDown->setProperty( "themeID", QVariant(QString::fromUtf8("downArrowIconSmall"))); @@ -102,17 +107,21 @@ MacroActionRunEdit::MacroActionRunEdit( SLOT(RemoveArg())); QWidget::connect(_argUp, SIGNAL(clicked()), this, SLOT(ArgUp())); QWidget::connect(_argDown, SIGNAL(clicked()), this, SLOT(ArgDown())); - connect(_argList, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, - SLOT(ArgItemClicked(QListWidgetItem *))); + QWidget::connect(_argList, SIGNAL(itemDoubleClicked(QListWidgetItem *)), + this, SLOT(ArgItemClicked(QListWidgetItem *))); + QWidget::connect(_workingDirectory, + SIGNAL(PathChanged(const QString &)), this, + SLOT(WorkingDirectoryChanged(const QString &))); auto *entryLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = { {"{{filePath}}", _filePath}, + {"{{workingDirectory}}", _workingDirectory}, }; placeWidgets(obs_module_text("AdvSceneSwitcher.action.run.entry"), - entryLayout, widgetPlaceholders); + entryLayout, widgetPlaceholders, false); - auto *argButtonLayout = new QHBoxLayout; + auto argButtonLayout = new QHBoxLayout; argButtonLayout->addWidget(_addArg); argButtonLayout->addWidget(_removeArg); QFrame *line = new QFrame(); @@ -123,12 +132,19 @@ MacroActionRunEdit::MacroActionRunEdit( argButtonLayout->addWidget(_argDown); argButtonLayout->addStretch(); + auto workingDirectoryLayout = new QHBoxLayout; + placeWidgets( + obs_module_text( + "AdvSceneSwitcher.action.run.entry.workingDirectory"), + workingDirectoryLayout, widgetPlaceholders, false); + auto *mainLayout = new QVBoxLayout; mainLayout->addLayout(entryLayout); mainLayout->addWidget(new QLabel( obs_module_text("AdvSceneSwitcher.action.run.arguments"))); mainLayout->addWidget(_argList); mainLayout->addLayout(argButtonLayout); + mainLayout->addLayout(workingDirectoryLayout); setLayout(mainLayout); _entryData = entryData; @@ -146,6 +162,8 @@ void MacroActionRunEdit::UpdateEntryData() QListWidgetItem *item = new QListWidgetItem(arg, _argList); item->setData(Qt::UserRole, arg); } + _workingDirectory->SetPath( + QString::fromStdString(_entryData->_workingDirectory)); SetArgListSize(); } @@ -264,6 +282,15 @@ void MacroActionRunEdit::ArgItemClicked(QListWidgetItem *item) _entryData->_args[idx] = arg; } +void MacroActionRunEdit::WorkingDirectoryChanged(const QString &path) +{ + if (_loading || !_entryData) { + return; + } + + _entryData->_workingDirectory = path.toStdString(); +} + void MacroActionRunEdit::SetArgListSize() { setHeightToContentHeight(_argList); diff --git a/src/macro-core/macro-action-run.hpp b/src/macro-core/macro-action-run.hpp index d88121cb..d3544874 100644 --- a/src/macro-core/macro-action-run.hpp +++ b/src/macro-core/macro-action-run.hpp @@ -22,6 +22,7 @@ public: } std::string _path = obs_module_text("AdvSceneSwitcher.enterPath"); + std::string _workingDirectory = ""; QStringList _args; private: @@ -51,6 +52,7 @@ private slots: void ArgUp(); void ArgDown(); void ArgItemClicked(QListWidgetItem *); + void WorkingDirectoryChanged(const QString &text); signals: void HeaderInfoChanged(const QString &); @@ -66,5 +68,6 @@ private: QPushButton *_removeArg; QPushButton *_argUp; QPushButton *_argDown; + FileSelection *_workingDirectory; bool _loading = true; };