UI: Add always on top checkbox to projector context menu
This checkbox overrides the global always on top setting
This commit is contained in:
parent
4929de408d
commit
d8c215df0e
@ -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);
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user