未验证 提交 bb890a67 编写于 作者: J Jim 提交者: GitHub

Merge pull request #2821 from Bennik2000/always_on_top_projectors

UI: Add always on top checkbox to projector context menu
......@@ -590,6 +590,7 @@ obs_data_array_t *OBSBasic::SaveProjectors()
obs_data_t *data = obs_data_create();
ProjectorType type = projector->GetProjectorType();
switch (type) {
case ProjectorType::Scene:
case ProjectorType::Source: {
......@@ -601,11 +602,20 @@ obs_data_array_t *OBSBasic::SaveProjectors()
default:
break;
}
obs_data_set_int(data, "monitor", projector->GetMonitor());
obs_data_set_int(data, "type", static_cast<int>(type));
obs_data_set_string(
data, "geometry",
projector->saveGeometry().toBase64().constData());
if (projector->IsAlwaysOnTopOverridden())
obs_data_set_bool(data, "alwaysOnTop",
projector->IsAlwaysOnTop());
obs_data_set_bool(data, "alwaysOnTopOverridden",
projector->IsAlwaysOnTopOverridden());
obs_data_array_push_back(savedProjectors, data);
obs_data_release(data);
};
......@@ -792,6 +802,10 @@ void OBSBasic::LoadSavedProjectors(obs_data_array_t *array)
info->geometry =
std::string(obs_data_get_string(data, "geometry"));
info->name = std::string(obs_data_get_string(data, "name"));
info->alwaysOnTop = obs_data_get_bool(data, "alwaysOnTop");
info->alwaysOnTopOverridden =
obs_data_get_bool(data, "alwaysOnTopOverridden");
savedProjectorsArray.emplace_back(info);
obs_data_release(data);
......@@ -6872,6 +6886,10 @@ void OBSBasic::OpenSavedProjector(SavedProjectorInfo *info)
Qt::LeftToRight, Qt::AlignCenter,
size(), rect));
}
if (info->alwaysOnTopOverridden)
projector->SetIsAlwaysOnTop(info->alwaysOnTop,
true);
}
}
}
......
......@@ -82,6 +82,8 @@ struct SavedProjectorInfo {
int monitor;
std::string geometry;
std::string name;
bool alwaysOnTop;
bool alwaysOnTopOverridden;
};
struct QuickTransition {
......
......@@ -10,6 +10,8 @@
#include "platform.hpp"
static QList<OBSProjector *> multiviewProjectors;
static QList<OBSProjector *> allProjectors;
static bool updatingMultiview = false, drawLabel, drawSafeArea, mouseSwitching,
transitionOnDoubleClick;
static MultiviewLayout multiviewLayout;
......@@ -41,6 +43,10 @@ OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_, int monitor,
addAction(action);
connect(action, SIGNAL(triggered()), this, SLOT(EscapeTriggered()));
isAlwaysOnTop = config_get_bool(GetGlobalConfig(), "BasicWindow",
"ProjectorAlwaysOnTop");
SetAlwaysOnTop(this, isAlwaysOnTop);
setAttribute(Qt::WA_DeleteOnClose, true);
//disable application quit when last window closed
......@@ -121,6 +127,8 @@ OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_, int monitor,
if (source)
obs_source_inc_showing(source);
allProjectors.push_back(this);
ready = true;
show();
......@@ -837,6 +845,16 @@ void OBSProjector::mousePressEvent(QMouseEvent *event)
this, SLOT(ResizeToContent()));
}
QAction *alwaysOnTopButton =
new QAction(QTStr("Basic.MainMenu.AlwaysOnTop"), this);
alwaysOnTopButton->setCheckable(true);
alwaysOnTopButton->setChecked(isAlwaysOnTop);
connect(alwaysOnTopButton, &QAction::toggled, this,
&OBSProjector::AlwaysOnTopToggled);
popup.addAction(alwaysOnTopButton);
popup.addAction(QTStr("Close"), this, SLOT(EscapeTriggered()));
popup.exec(QCursor::pos());
}
......@@ -862,6 +880,8 @@ void OBSProjector::EscapeTriggered()
{
OBSBasic *main = reinterpret_cast<OBSBasic *>(App()->GetMainWindow());
main->DeleteProjector(this);
allProjectors.removeAll(this);
}
void OBSProjector::UpdateMultiview()
......@@ -1087,8 +1107,31 @@ void OBSProjector::ResizeToContent()
resize(newX, newY);
}
void OBSProjector::AlwaysOnTopToggled(bool isAlwaysOnTop)
{
SetIsAlwaysOnTop(isAlwaysOnTop, true);
}
void OBSProjector::closeEvent(QCloseEvent *event)
{
EscapeTriggered();
event->accept();
}
bool OBSProjector::IsAlwaysOnTop() const
{
return isAlwaysOnTop;
}
bool OBSProjector::IsAlwaysOnTopOverridden() const
{
return isAlwaysOnTopOverridden;
}
void OBSProjector::SetIsAlwaysOnTop(bool isAlwaysOnTop, bool isOverridden)
{
this->isAlwaysOnTop = isAlwaysOnTop;
this->isAlwaysOnTopOverridden = isOverridden;
SetAlwaysOnTop(this, isAlwaysOnTop);
}
......@@ -36,6 +36,8 @@ private:
void mouseDoubleClickEvent(QMouseEvent *event) override;
void closeEvent(QCloseEvent *event) override;
bool isAlwaysOnTop;
bool isAlwaysOnTopOverridden = false;
int savedMonitor = -1;
ProjectorType type = ProjectorType::Source;
std::vector<OBSWeakSource> multiviewScenes;
......@@ -80,6 +82,7 @@ private slots:
void OpenFullScreenProjector();
void ResizeToContent();
void OpenWindowedProjector();
void AlwaysOnTopToggled(bool alwaysOnTop);
public:
OBSProjector(QWidget *widget, obs_source_t *source_, int monitor,
......@@ -92,4 +95,8 @@ public:
static void UpdateMultiviewProjectors();
void RenameProjector(QString oldName, QString newName);
void SetHideCursor();
bool IsAlwaysOnTop() const;
bool IsAlwaysOnTopOverridden() const;
void SetIsAlwaysOnTop(bool isAlwaysOnTop, bool isOverridden);
};
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册