Skip to content

Commit

Permalink
Add screenshot condition
Browse files Browse the repository at this point in the history
  • Loading branch information
WarmUpTill committed Dec 9, 2024
1 parent 9e13067 commit 80c652c
Show file tree
Hide file tree
Showing 4 changed files with 148 additions and 0 deletions.
6 changes: 6 additions & 0 deletions data/locale/en-US.ini
Original file line number Diff line number Diff line change
Expand Up @@ -770,6 +770,9 @@ AdvSceneSwitcher.condition.streamDeck.startListen="Start listening"
AdvSceneSwitcher.condition.streamDeck.stopListen="Stop listening"
AdvSceneSwitcher.condition.streamDeck.pluginDownload="<html><head/><body><p>The Stream Deck plugin can be found <a href=\"https://github.com/WarmUpTill/advanced-scene-switcher-streamdeck-plugin/releases\"><span style=\" text-decoration: underline; color:#268bd2;\">here on GitHub</span></a>.</p></body></html>"

AdvSceneSwitcher.condition.screenshot="Screenshot"
AdvSceneSwitcher.condition.screenshot.entry="A screenshot was taken"

# Macro Actions
AdvSceneSwitcher.action.unknown="Unknown action"
AdvSceneSwitcher.action.scene="Switch scene"
Expand Down Expand Up @@ -1971,6 +1974,9 @@ AdvSceneSwitcher.tempVar.queue.size="Size"
AdvSceneSwitcher.tempVar.queue.running="Is running"
AdvSceneSwitcher.tempVar.queue.running.description="Returns \"true\" if the queue is started and \"false\" if it is stopped."

AdvSceneSwitcher.tempVar.screenshot.lastScreenshotPath="Last screenshot path"
AdvSceneSwitcher.tempVar.screenshot.lastScreenshotPath.description="The filesystem path to the last screenshot taken."

AdvSceneSwitcher.selectScene="--select scene--"
AdvSceneSwitcher.selectPreviousScene="Previous Scene"
AdvSceneSwitcher.selectCurrentScene="Current Scene"
Expand Down
2 changes: 2 additions & 0 deletions plugins/base/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,8 @@ target_sources(
macro-condition-scene-visibility.hpp
macro-condition-scene.cpp
macro-condition-scene.hpp
macro-condition-screenshot.cpp
macro-condition-screenshot.hpp
macro-condition-slideshow.cpp
macro-condition-slideshow.hpp
macro-condition-source.cpp
Expand Down
90 changes: 90 additions & 0 deletions plugins/base/macro-condition-screenshot.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
#include "macro-condition-screenshot.hpp"
#include "layout-helpers.hpp"

#include <obs-frontend-api.h>
#include <thread>

namespace advss {

const std::string MacroConditionScreenshot::id = "screenshot";

bool MacroConditionScreenshot::_registered = MacroConditionFactory::Register(
MacroConditionScreenshot::id,
{MacroConditionScreenshot::Create, MacroConditionScreenshotEdit::Create,
"AdvSceneSwitcher.condition.screenshot"});

static std::chrono::high_resolution_clock::time_point screenshotTakenTime{};
static bool setupScreenshotTakenEventHandler();
static bool setupDone = setupScreenshotTakenEventHandler();

static bool setupScreenshotTakenEventHandler()
{
static auto handleScreenshotEvent = [](enum obs_frontend_event event,
void *) {
switch (event) {
case OBS_FRONTEND_EVENT_SCREENSHOT_TAKEN:
screenshotTakenTime =
std::chrono::high_resolution_clock::now();
break;
default:
break;
};
};
obs_frontend_add_event_callback(handleScreenshotEvent, nullptr);
return true;
}

bool MacroConditionScreenshot::CheckCondition()
{
if (!_screenshotTimeInitialized) {
_screenshotTime = screenshotTakenTime;
_screenshotTimeInitialized = true;
return false;
}

auto lastScreenshotPath = obs_frontend_get_last_screenshot();
SetTempVarValue("lastScreenshotPath", lastScreenshotPath);
bfree(lastScreenshotPath);

bool newSaveOccurred = _screenshotTime != screenshotTakenTime;
_screenshotTime = screenshotTakenTime;
return newSaveOccurred;
}

bool MacroConditionScreenshot::Save(obs_data_t *obj) const
{
MacroCondition::Save(obj);
return true;
}

bool MacroConditionScreenshot::Load(obs_data_t *obj)
{
MacroCondition::Load(obj);
return true;
}

void MacroConditionScreenshot::SetupTempVars()
{
MacroCondition::SetupTempVars();
AddTempvar(
"lastScreenshotPath",
obs_module_text(
"AdvSceneSwitcher.tempVar.screenshot.lastScreenshotPath"),
obs_module_text(
"AdvSceneSwitcher.tempVar.screenshot.lastScreenshotPath.description"));
}

MacroConditionScreenshotEdit::MacroConditionScreenshotEdit(
QWidget *parent, std::shared_ptr<MacroConditionScreenshot> entryData)
: QWidget(parent)
{
auto layout = new QHBoxLayout;
PlaceWidgets(
obs_module_text("AdvSceneSwitcher.condition.screenshot.entry"),
layout, {});
setLayout(layout);

_entryData = entryData;
}

} // namespace advss
50 changes: 50 additions & 0 deletions plugins/base/macro-condition-screenshot.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#pragma once
#include "macro-condition-edit.hpp"

#include <QWidget>
#include <QComboBox>

namespace advss {

class MacroConditionScreenshot : public MacroCondition {
public:
MacroConditionScreenshot(Macro *m) : MacroCondition(m) {}
bool CheckCondition();
bool Save(obs_data_t *obj) const;
bool Load(obs_data_t *obj);
std::string GetId() const { return id; };
static std::shared_ptr<MacroCondition> Create(Macro *m)
{
return std::make_shared<MacroConditionScreenshot>(m);
}

private:
void SetupTempVars();

bool _screenshotTimeInitialized = false;
std::chrono::high_resolution_clock::time_point _screenshotTime = {};
static bool _registered;
static const std::string id;
};

class MacroConditionScreenshotEdit : public QWidget {
Q_OBJECT

public:
MacroConditionScreenshotEdit(
QWidget *parent,
std::shared_ptr<MacroConditionScreenshot> cond = nullptr);
static QWidget *Create(QWidget *parent,
std::shared_ptr<MacroCondition> cond)
{
return new MacroConditionScreenshotEdit(
parent,
std::dynamic_pointer_cast<MacroConditionScreenshot>(
cond));
}

private:
std::shared_ptr<MacroConditionScreenshot> _entryData;
};

} // namespace advss

0 comments on commit 80c652c

Please sign in to comment.