Add support setting title and icon of system tray message

This commit is contained in:
WarmUpTill
2023-05-02 00:04:09 +02:00
committed by WarmUpTill
parent 7b355ebc49
commit 9cfa88dd8c
9 changed files with 94 additions and 31 deletions

View File

@@ -545,7 +545,6 @@ AdvSceneSwitcher.action.random="Zufall"
AdvSceneSwitcher.action.random.allowRepeat="Aufeinanderfolgende Ausführung desselben Makros zulassen"
AdvSceneSwitcher.action.random.entry="Zufällige Ausführung eines der folgenden Makros (pausierte Makros werden ignoriert)"
AdvSceneSwitcher.action.systray="Benachrichtigung im System-Tray"
AdvSceneSwitcher.action.systray.entry="Benachrichtigung anzeigen: {{message}}"
AdvSceneSwitcher.action.screenshot="Screenshot"
AdvSceneSwitcher.action.screenshot.save.default="Standard"
AdvSceneSwitcher.action.screenshot.save.custom="Benutzerdefiniert"

View File

@@ -584,7 +584,10 @@ AdvSceneSwitcher.action.random="Random"
AdvSceneSwitcher.action.random.allowRepeat="Allow consecutive execution of the same macro"
AdvSceneSwitcher.action.random.entry="Randomly run any of the following macros (paused macros are ignored)"
AdvSceneSwitcher.action.systray="System tray notification"
AdvSceneSwitcher.action.systray.entry="Show notification: {{message}}"
AdvSceneSwitcher.action.systray.title="Title:"
AdvSceneSwitcher.action.systray.message="Message:"
AdvSceneSwitcher.action.systray.icon="Icon:"
AdvSceneSwitcher.action.systray.iconHint="Leave blank to use the default icon"
AdvSceneSwitcher.action.screenshot="Screenshot"
AdvSceneSwitcher.action.screenshot.save.default="Default"
AdvSceneSwitcher.action.screenshot.save.custom="Custom"

View File

@@ -460,7 +460,6 @@ AdvSceneSwitcher.action.timer.entry="{{timerAction}} temporizadores en {{macros}
AdvSceneSwitcher.action.random="Aleatorio"
AdvSceneSwitcher.action.random.entry="Ejecute aleatoriamente cualquiera de las siguientes macros (las macros en pausa se ignoran)"
AdvSceneSwitcher.action.systray="Notificación de la bandeja del sistema"
AdvSceneSwitcher.action.systray.entry="Mostrar notificación: {{message}}"
AdvSceneSwitcher.action.screenshot="Captura de pantalla"
AdvSceneSwitcher.action.screenshot.mainOutput="Salida principal de OBS"
AdvSceneSwitcher.action.profile="Perfil"

View File

@@ -377,7 +377,6 @@ AdvSceneSwitcher.action.timer.entry="{{timerAction}} zamanlayıcılar açık {{m
AdvSceneSwitcher.action.random="Rastgele"
AdvSceneSwitcher.action.random.entry="Aşağıdaki makrolardan herhangi birini rastgele çalıştırın (duraklatılmış makrolar yoksayılır)"
AdvSceneSwitcher.action.systray="Sistem tepsisi bildirimi"
AdvSceneSwitcher.action.systray.entry="Bildirimleri göster: {{message}}"
AdvSceneSwitcher.action.screenshot="Ekran görüntüsü"
AdvSceneSwitcher.action.screenshot.mainOutput="OBS'nin ana çıkışı"
AdvSceneSwitcher.action.profile="Profil"

View File

@@ -505,7 +505,6 @@ AdvSceneSwitcher.action.timer.entry="{{timerAction}} 定时在 {{macros}} {{dura
AdvSceneSwitcher.action.random="随机"
AdvSceneSwitcher.action.random.entry="随机运行以下任何宏(忽略暂停的宏)"
AdvSceneSwitcher.action.systray="系统托盘通知"
AdvSceneSwitcher.action.systray.entry="显示通知: {{message}}"
AdvSceneSwitcher.action.screenshot="截图"
AdvSceneSwitcher.action.screenshot.save.default="默认"
AdvSceneSwitcher.action.screenshot.save.custom="其他"

View File

@@ -12,54 +12,102 @@ bool MacroActionSystray::_registered = MacroActionFactory::Register(
bool MacroActionSystray::PerformAction()
{
if (_msg.empty()) {
return true;
if (_lastPath != std::string(_iconPath)) {
_lastPath = _iconPath;
_icon = QIcon(QString::fromStdString(_iconPath));
}
DisplayTrayMessage(obs_module_text("AdvSceneSwitcher.pluginName"),
QString::fromStdString(_msg));
DisplayTrayMessage(QString::fromStdString(_title),
QString::fromStdString(_message), _icon);
return true;
}
void MacroActionSystray::LogAction() const
{
vblog(LOG_INFO, "display systray message \"%s\"", _msg.c_str());
vblog(LOG_INFO, "display systray message \"%s\":\n%s", _title.c_str(),
_message.c_str());
}
bool MacroActionSystray::Save(obs_data_t *obj) const
{
MacroAction::Save(obj);
obs_data_set_string(obj, "message", _msg.c_str());
_message.Save(obj, "message");
_title.Save(obj, "title");
_iconPath.Save(obj, "icon");
obs_data_set_int(obj, "version", 1);
return true;
}
bool MacroActionSystray::Load(obs_data_t *obj)
{
MacroAction::Load(obj);
_msg = obs_data_get_string(obj, "message");
_message.Load(obj, "message");
_title.Load(obj, "title");
_iconPath.Load(obj, "icon");
if (!obs_data_has_user_value(obj, "version")) {
_title = obs_module_text("AdvSceneSwitcher.pluginName");
}
return true;
}
MacroActionSystrayEdit::MacroActionSystrayEdit(
QWidget *parent, std::shared_ptr<MacroActionSystray> entryData)
: QWidget(parent)
: QWidget(parent),
_message(new VariableLineEdit(this)),
_title(new VariableLineEdit(this)),
_iconPath(new FileSelection())
{
_msg = new QLineEdit();
QWidget::connect(_msg, SIGNAL(editingFinished()), this,
SLOT(MessageChanged()));
_iconPath->setToolTip(
obs_module_text("AdvSceneSwitcher.action.systray.iconHint"));
QHBoxLayout *mainLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{message}}", _msg},
};
PlaceWidgets(obs_module_text("AdvSceneSwitcher.action.systray.entry"),
mainLayout, widgetPlaceholders);
setLayout(mainLayout);
QWidget::connect(_message, SIGNAL(editingFinished()), this,
SLOT(MessageChanged()));
QWidget::connect(_title, SIGNAL(editingFinished()), this,
SLOT(TitleChanged()));
QWidget::connect(_iconPath, SIGNAL(PathChanged(const QString &)), this,
SLOT(IconPathChanged(const QString &)));
auto layout = new QGridLayout();
layout->addWidget(new QLabel(obs_module_text(
"AdvSceneSwitcher.action.systray.title")),
0, 0);
layout->addWidget(_title, 0, 1);
layout->addWidget(new QLabel(obs_module_text(
"AdvSceneSwitcher.action.systray.message")),
1, 0);
layout->addWidget(_message, 1, 1);
layout->addWidget(new QLabel(obs_module_text(
"AdvSceneSwitcher.action.systray.icon")),
2, 0);
layout->addWidget(_iconPath, 2, 1);
setLayout(layout);
_entryData = entryData;
_msg->setText(QString::fromStdString(_entryData->_msg));
_message->setText(_entryData->_message);
_title->setText(_entryData->_title);
_iconPath->SetPath(_entryData->_iconPath);
_loading = false;
}
void MacroActionSystrayEdit::TitleChanged()
{
if (_loading || !_entryData) {
return;
}
auto lock = LockContext();
_entryData->_title = _title->text().toStdString();
}
void MacroActionSystrayEdit::IconPathChanged(const QString &text)
{
if (_loading || !_entryData) {
return;
}
auto lock = LockContext();
_entryData->_iconPath = text.toStdString();
}
void MacroActionSystrayEdit::MessageChanged()
{
if (_loading || !_entryData) {
@@ -67,7 +115,7 @@ void MacroActionSystrayEdit::MessageChanged()
}
auto lock = LockContext();
_entryData->_msg = _msg->text().toStdString();
_entryData->_message = _message->text().toStdString();
}
} // namespace advss

View File

@@ -1,5 +1,7 @@
#pragma once
#include "macro-action-edit.hpp"
#include "variable-string.hpp"
#include "file-selection.hpp"
#include <QLineEdit>
@@ -18,9 +20,14 @@ public:
return std::make_shared<MacroActionSystray>(m);
}
std::string _msg = "";
StringVariable _message = "";
StringVariable _title = obs_module_text("AdvSceneSwitcher.pluginName");
StringVariable _iconPath = "";
private:
QIcon _icon;
std::string _lastPath;
static bool _registered;
static const std::string id;
};
@@ -42,12 +49,16 @@ public:
private slots:
void MessageChanged();
void TitleChanged();
void IconPathChanged(const QString &text);
protected:
std::shared_ptr<MacroActionSystray> _entryData;
private:
QLineEdit *_msg;
VariableLineEdit *_message;
VariableLineEdit *_title;
FileSelection *_iconPath;
bool _loading = true;
};

View File

@@ -466,15 +466,19 @@ bool DisplayMessage(const QString &msg, bool question)
return false;
}
void DisplayTrayMessage(const QString &title, const QString &msg)
void DisplayTrayMessage(const QString &title, const QString &msg,
const QIcon &icon)
{
auto tray = reinterpret_cast<QSystemTrayIcon *>(
obs_frontend_get_system_tray());
if (!tray) {
return;
}
tray->showMessage(title, msg);
if (icon.isNull()) {
tray->showMessage(title, msg);
} else {
tray->showMessage(title, msg, icon);
}
}
void AddSelectionEntry(QComboBox *sel, const char *description, bool selectable,

View File

@@ -100,7 +100,8 @@ int FindIdxInRagne(QComboBox *list, int start, int stop,
/* UI helpers */
bool DisplayMessage(const QString &msg, bool question = false);
void DisplayTrayMessage(const QString &title, const QString &msg);
void DisplayTrayMessage(const QString &title, const QString &msg,
const QIcon &icon = QIcon());
bool WindowPosValid(QPoint pos);
std::string GetThemeTypeName();