From 3c355ac6fe4bdb5462c902c88b6789d1205da085 Mon Sep 17 00:00:00 2001 From: WarmUpTill <19472752+WarmUpTill@users.noreply.github.com> Date: Fri, 12 Sep 2025 20:28:29 +0200 Subject: [PATCH] Improve file condition * Add support for existence check * Add support for "is file" check * Add support for "is folder" check * Add more temp vars --- data/locale/en-US.ini | 16 ++++++ plugins/base/macro-condition-file.cpp | 79 +++++++++++++++++++++++++++ plugins/base/macro-condition-file.hpp | 12 ++++ 3 files changed, 107 insertions(+) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 4a6f2032..052be1cf 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -338,6 +338,9 @@ AdvSceneSwitcher.condition.file="File" AdvSceneSwitcher.condition.file.type.match="matches" AdvSceneSwitcher.condition.file.type.contentChange="content changed" AdvSceneSwitcher.condition.file.type.dateChange="modification date changed" +AdvSceneSwitcher.condition.file.type.exists="exists" +AdvSceneSwitcher.condition.file.type.isFile="is a file" +AdvSceneSwitcher.condition.file.type.isFolder="is a folder" AdvSceneSwitcher.condition.file.remote="Remote file" AdvSceneSwitcher.condition.file.local="Local file" AdvSceneSwitcher.condition.file.entry.line1="{{fileType}}{{filePath}}{{conditions}}{{useRegex}}" @@ -2092,6 +2095,19 @@ AdvSceneSwitcher.tempVar.clipboard.text.description="The text contained in the c AdvSceneSwitcher.tempVar.file.content="File content" AdvSceneSwitcher.tempVar.file.date="File modification date" +AdvSceneSwitcher.tempVar.file.basename="File basename" +AdvSceneSwitcher.tempVar.file.basename.description="Returns the base name of the file without the path.\nThe base name consists of all characters in the file up to (but not including) the first '.' character." +AdvSceneSwitcher.tempVar.file.basenameComplete="File basename (complete)" +AdvSceneSwitcher.tempVar.file.basenameComplete.description="Returns the complete base name of the file without the path.\nThe complete base name consists of all characters in the file up to (but not including) the last '.' character." +AdvSceneSwitcher.tempVar.file.suffix="File suffix" +AdvSceneSwitcher.tempVar.file.suffix.description="Returns the suffix (extension) of the file.\nThe suffix consists of all characters in the file after (but not including) the last '.'." +AdvSceneSwitcher.tempVar.file.suffixComplete="File suffix (complete)" +AdvSceneSwitcher.tempVar.file.suffixComplete.description="Returns the complete suffix (extension) of the file.\nThe complete suffix consists of all characters in the file after (but not including) the first '.'." +AdvSceneSwitcher.tempVar.file.filename="File name" +AdvSceneSwitcher.tempVar.file.absoluteFilePath="Absolute file path" +AdvSceneSwitcher.tempVar.file.absolutePath="Absolute path" +AdvSceneSwitcher.tempVar.file.isAbsolutePath="Path is absolute" + AdvSceneSwitcher.tempVar.folder.newFiles="New files" AdvSceneSwitcher.tempVar.folder.changedFiles="Changed files" diff --git a/plugins/base/macro-condition-file.cpp b/plugins/base/macro-condition-file.cpp index 6a166c13..2a2311e7 100644 --- a/plugins/base/macro-condition-file.cpp +++ b/plugins/base/macro-condition-file.cpp @@ -156,6 +156,42 @@ void MacroConditionFile::SetupTempVars() obs_module_text( "AdvSceneSwitcher.tempVar.file.content")); } + + if (_fileType == FileType::REMOTE) { + return; + } + + AddTempvar( + "basename", + obs_module_text("AdvSceneSwitcher.tempVar.file.basename"), + obs_module_text( + "AdvSceneSwitcher.tempVar.file.basename.description")); + AddTempvar( + "basenameComplete", + obs_module_text( + "AdvSceneSwitcher.tempVar.file.basenameComplete"), + obs_module_text( + "AdvSceneSwitcher.tempVar.file.basenameComplete.description")); + AddTempvar("suffix", + obs_module_text("AdvSceneSwitcher.tempVar.file.suffix"), + obs_module_text( + "AdvSceneSwitcher.tempVar.file.suffix.description")); + AddTempvar( + "suffixComplete", + obs_module_text("AdvSceneSwitcher.tempVar.file.suffixComplete"), + obs_module_text( + "AdvSceneSwitcher.tempVar.file.suffixComplete.description")); + AddTempvar("filename", + obs_module_text("AdvSceneSwitcher.tempVar.file.filename")); + AddTempvar("absoluteFilePath", + obs_module_text( + "AdvSceneSwitcher.tempVar.file.absoluteFilePath")); + AddTempvar( + "absolutePath", + obs_module_text("AdvSceneSwitcher.tempVar.file.absolutePath")); + AddTempvar("isAbsolutePath", + obs_module_text( + "AdvSceneSwitcher.tempVar.file.isAbsolutePath")); } bool MacroConditionFile::CheckCondition() @@ -175,10 +211,47 @@ bool MacroConditionFile::CheckCondition() case Condition::DATE_CHANGE: ret = CheckChangeDate(); break; + case Condition::IS_FILE: { + QFileInfo info(QString::fromStdString(_file)); + ret = info.isFile(); + break; + } + case Condition::IS_FOLDER: { + QFileInfo info(QString::fromStdString(_file)); + ret = info.isDir(); + break; + } + case Condition::EXISTS: { + QFileInfo info(QString::fromStdString(_file)); + ret = info.exists(); + break; + } default: break; } + if (std::string(_file) != _lastFile) { + QFileInfo info(QString::fromStdString(_file)); + _basename = info.baseName().toStdString(); + _basenameComplete = info.completeBaseName().toStdString(); + _suffix = info.suffix().toStdString(); + _suffixComplete = info.completeSuffix().toStdString(); + _filename = info.fileName().toStdString(); + _absoluteFilePath = info.absoluteFilePath().toStdString(); + _absolutePath = info.absolutePath().toStdString(); + _isAbsolutePath = info.isAbsolute(); + _lastFile = _file; + } + + SetTempVarValue("basename", _basename); + SetTempVarValue("basenameComplete", _basenameComplete); + SetTempVarValue("suffix", _suffix); + SetTempVarValue("suffixComplete", _suffixComplete); + SetTempVarValue("filename", _filename); + SetTempVarValue("absoluteFilePath", _absoluteFilePath); + SetTempVarValue("absolutePath", _absolutePath); + SetTempVarValue("isAbsolutePath", _isAbsolutePath); + if (GetVariableValue().empty()) { SetVariableValue(ret ? "true" : "false"); } @@ -237,6 +310,12 @@ static void populateConditions(QComboBox *list) "AdvSceneSwitcher.condition.file.type.contentChange")); list->addItem(obs_module_text( "AdvSceneSwitcher.condition.file.type.dateChange")); + list->addItem( + obs_module_text("AdvSceneSwitcher.condition.file.type.exists")); + list->addItem( + obs_module_text("AdvSceneSwitcher.condition.file.type.isFile")); + list->addItem(obs_module_text( + "AdvSceneSwitcher.condition.file.type.isFolder")); } MacroConditionFileEdit::MacroConditionFileEdit( diff --git a/plugins/base/macro-condition-file.hpp b/plugins/base/macro-condition-file.hpp index befd0038..c6340608 100644 --- a/plugins/base/macro-condition-file.hpp +++ b/plugins/base/macro-condition-file.hpp @@ -35,6 +35,9 @@ public: MATCH, CONTENT_CHANGE, DATE_CHANGE, + EXISTS, + IS_FILE, + IS_FOLDER, }; void SetCondition(Condition condition); Condition GetCondition() const { return _condition; } @@ -59,6 +62,15 @@ private: Condition _condition = Condition::MATCH; QDateTime _lastMod; size_t _lastHash = 0; + std::string _lastFile; + std::string _basename; + std::string _basenameComplete; + std::string _suffix; + std::string _suffixComplete; + std::string _filename; + std::string _absoluteFilePath; + std::string _absolutePath; + bool _isAbsolutePath = false; static bool _registered; static const std::string id; };