Merge pull request #1260 from admshao/multiview-updates

Multiview updates
This commit is contained in:
Jim
2018-05-21 14:58:55 -07:00
committed by GitHub
8 changed files with 678 additions and 403 deletions
+9 -4
View File
@@ -571,11 +571,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Always minimize to system tray in
Basic.Settings.General.SaveProjectors="Save projectors on exit"
Basic.Settings.General.SwitchOnDoubleClick="Transition to scene when double-clicked"
Basic.Settings.General.StudioPortraitLayout="Enable portrait/vertical layout"
Basic.Settings.General.Multiview="Multiview"
Basic.Settings.General.Multiview.MouseSwitch="Click to switch between scenes"
Basic.Settings.General.Multiview.DrawSourceNames="Show scene names"
Basic.Settings.General.Multiview.DrawSafeAreas="Draw safe areas (EBU R 95)"
Basic.Settings.General.MultiviewLayout="Multiview Layout"
Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontal, Top"
Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontal, Bottom"
Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertical, Left"
Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertical, Right"
Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontal, Top (8 Scenes)"
Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontal, Bottom (8 Scenes)"
Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertical, Left (8 Scenes)"
Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertical, Right (8 Scenes)"
Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Horizontal, Top (24 Scenes)"
# basic mode 'stream' settings
Basic.Settings.Stream="Stream"
+65 -1
View File
@@ -582,10 +582,74 @@
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBoxMultiview">
<property name="title">
<string>Basic.Settings.General.Multiview</string>
</property>
<layout class="QFormLayout" name="formLayoutMultiview">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="topMargin">
<number>2</number>
</property>
<item row="0" column="0">
<spacer name="horizontalSpacerMultiview">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>170</width>
<height>5</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="multiviewMouseSwitch">
<property name="text">
<string>Basic.Settings.General.Multiview.MouseSwitch</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="multiviewDrawNames">
<property name="text">
<string>Basic.Settings.General.Multiview.DrawSourceNames</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="multiviewDrawAreas">
<property name="text">
<string>Basic.Settings.General.Multiview.DrawSafeAreas</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="multiviewLayout"/>
</item>
<item row="2" column="0">
<item row="3" column="0">
<widget class="QLabel" name="label_64">
<property name="text">
<string>Basic.Settings.General.MultiviewLayout</string>
+52
View File
@@ -421,6 +421,15 @@ bool OBSApp::InitGlobalConfigDefaults()
config_set_default_bool(globalConfig, "BasicWindow",
"VerticalVolControl", false);
config_set_default_bool(globalConfig, "BasicWindow",
"MultiviewMouseSwitch", true);
config_set_default_bool(globalConfig, "BasicWindow",
"MultiviewDrawNames", true);
config_set_default_bool(globalConfig, "BasicWindow",
"MultiviewDrawAreas", true);
#ifdef _WIN32
config_set_default_bool(globalConfig, "Audio", "DisableAudioDucking",
true);
@@ -591,6 +600,42 @@ static string GetSceneCollectionFileFromName(const char *name)
return outputPath;
}
bool OBSApp::UpdatePre22MultiviewLayout(const char *layout)
{
if (!layout)
return false;
if (astrcmpi(layout, "horizontaltop") == 0) {
config_set_int(globalConfig, "BasicWindow", "MultiviewLayout",
static_cast<int>(
MultiviewLayout::HORIZONTAL_TOP_8_SCENES));
return true;
}
if (astrcmpi(layout, "horizontalbottom") == 0) {
config_set_int(globalConfig, "BasicWindow", "MultiviewLayout",
static_cast<int>(
MultiviewLayout::HORIZONTAL_BOTTOM_8_SCENES));
return true;
}
if (astrcmpi(layout, "verticalleft") == 0) {
config_set_int(globalConfig, "BasicWindow", "MultiviewLayout",
static_cast<int>(
MultiviewLayout::VERTICAL_LEFT_8_SCENES));
return true;
}
if (astrcmpi(layout, "verticalright") == 0) {
config_set_int(globalConfig, "BasicWindow", "MultiviewLayout",
static_cast<int>(
MultiviewLayout::VERTICAL_RIGHT_8_SCENES));
return true;
}
return false;
}
bool OBSApp::InitGlobalConfig()
{
char path[512];
@@ -656,6 +701,13 @@ bool OBSApp::InitGlobalConfig()
changed = true;
}
if (config_has_user_value(globalConfig, "BasicWindow",
"MultiviewLayout")) {
const char *layout = config_get_string(globalConfig,
"BasicWindow", "MultiviewLayout");
changed |= UpdatePre22MultiviewLayout(layout);
}
if (changed)
config_save_safe(globalConfig, "tmp", nullptr);
+2
View File
@@ -78,6 +78,8 @@ private:
std::deque<obs_frontend_translate_ui_cb> translatorHooks;
bool UpdatePre22MultiviewLayout(const char *layout);
bool InitGlobalConfig();
bool InitGlobalConfigDefaults();
bool InitLocale();
+5 -2
View File
@@ -3251,8 +3251,10 @@ int OBSBasic::ResetVideo()
ResizeProgram(ovi.base_width, ovi.base_height);
}
if (ret == OBS_VIDEO_SUCCESS)
if (ret == OBS_VIDEO_SUCCESS) {
OBSBasicStats::InitializeValues();
OBSProjector::UpdateMultiviewProjectors();
}
return ret;
}
@@ -3773,6 +3775,8 @@ void OBSBasic::ChangeSceneIndex(bool relative, int offset, int invalidIdx)
item->setSelected(true);
sceneChanging = false;
OBSProjector::UpdateMultiviewProjectors();
}
void OBSBasic::on_actionSceneUp_triggered()
@@ -5672,7 +5676,6 @@ OBSProjector *OBSBasic::OpenProjector(obs_source_t *source, int monitor,
projectors[monitor] = projector;
}
projector->Init();
return projector;
}
+55 -21
View File
@@ -318,6 +318,9 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
HookWidget(ui->snapDistance, DSCROLL_CHANGED,GENERAL_CHANGED);
HookWidget(ui->doubleClickSwitch, CHECK_CHANGED, GENERAL_CHANGED);
HookWidget(ui->studioPortraitLayout, CHECK_CHANGED, GENERAL_CHANGED);
HookWidget(ui->multiviewMouseSwitch, CHECK_CHANGED, GENERAL_CHANGED);
HookWidget(ui->multiviewDrawNames, CHECK_CHANGED, GENERAL_CHANGED);
HookWidget(ui->multiviewDrawAreas, CHECK_CHANGED, GENERAL_CHANGED);
HookWidget(ui->multiviewLayout, COMBO_CHANGED, GENERAL_CHANGED);
HookWidget(ui->outputMode, COMBO_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->streamType, COMBO_CHANGED, STREAM1_CHANGED);
@@ -1100,30 +1103,37 @@ void OBSBasicSettings::LoadGeneralSettings()
"BasicWindow", "StudioPortraitLayout");
ui->studioPortraitLayout->setChecked(studioPortraitLayout);
bool multiviewMouseSwitch = config_get_bool(GetGlobalConfig(),
"BasicWindow", "MultiviewMouseSwitch");
ui->multiviewMouseSwitch->setChecked(multiviewMouseSwitch);
bool multiviewDrawNames = config_get_bool(GetGlobalConfig(),
"BasicWindow", "MultiviewDrawNames");
ui->multiviewDrawNames->setChecked(multiviewDrawNames);
bool multiviewDrawAreas = config_get_bool(GetGlobalConfig(),
"BasicWindow", "MultiviewDrawAreas");
ui->multiviewDrawAreas->setChecked(multiviewDrawAreas);
ui->multiviewLayout->addItem(QTStr(
"Basic.Settings.General.MultiviewLayout.Horizontal.Top"),
QT_UTF8("horizontaltop"));
static_cast<int>(MultiviewLayout::HORIZONTAL_TOP_8_SCENES));
ui->multiviewLayout->addItem(QTStr(
"Basic.Settings.General.MultiviewLayout.Horizontal.Bottom"),
QT_UTF8("horizontalbottom"));
static_cast<int>(MultiviewLayout::HORIZONTAL_BOTTOM_8_SCENES));
ui->multiviewLayout->addItem(QTStr(
"Basic.Settings.General.MultiviewLayout.Vertical.Left"),
QT_UTF8("verticalleft"));
static_cast<int>(MultiviewLayout::VERTICAL_LEFT_8_SCENES));
ui->multiviewLayout->addItem(QTStr(
"Basic.Settings.General.MultiviewLayout.Vertical.Right"),
QT_UTF8("verticalright"));
static_cast<int>(MultiviewLayout::VERTICAL_RIGHT_8_SCENES));
ui->multiviewLayout->addItem(QTStr(
"Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top"),
static_cast<int>(MultiviewLayout::HORIZONTAL_TOP_24_SCENES));
const char *multiviewLayoutText = config_get_string(GetGlobalConfig(),
"BasicWindow", "MultiviewLayout");
if (astrcmpi(multiviewLayoutText, "horizontalbottom") == 0)
ui->multiviewLayout->setCurrentIndex(1);
else if (astrcmpi(multiviewLayoutText, "verticalleft") == 0)
ui->multiviewLayout->setCurrentIndex(2);
else if (astrcmpi(multiviewLayoutText, "verticalright") == 0)
ui->multiviewLayout->setCurrentIndex(3);
else
ui->multiviewLayout->setCurrentIndex(0);
ui->multiviewLayout->setCurrentIndex(
config_get_int(GetGlobalConfig(), "BasicWindow",
"MultiviewLayout"));
loading = false;
}
@@ -2712,13 +2722,37 @@ void OBSBasicSettings::SaveGeneralSettings()
main->ResetUI();
}
if (WidgetChanged(ui->multiviewLayout)) {
config_set_string(GetGlobalConfig(), "BasicWindow",
"MultiviewLayout",
QT_TO_UTF8(GetComboData(ui->multiviewLayout)));
OBSProjector::UpdateMultiviewProjectors();
bool multiviewChanged = false;
if (WidgetChanged(ui->multiviewMouseSwitch)) {
config_set_bool(GetGlobalConfig(), "BasicWindow",
"MultiviewMouseSwitch",
ui->multiviewMouseSwitch->isChecked());
multiviewChanged = true;
}
if (WidgetChanged(ui->multiviewDrawNames)) {
config_set_bool(GetGlobalConfig(), "BasicWindow",
"MultiviewDrawNames",
ui->multiviewDrawNames->isChecked());
multiviewChanged = true;
}
if (WidgetChanged(ui->multiviewDrawAreas)) {
config_set_bool(GetGlobalConfig(), "BasicWindow",
"MultiviewDrawAreas",
ui->multiviewDrawAreas->isChecked());
multiviewChanged = true;
}
if (WidgetChanged(ui->multiviewLayout)) {
config_set_int(GetGlobalConfig(), "BasicWindow",
"MultiviewLayout",
ui->multiviewLayout->currentData().toInt());
multiviewChanged = true;
}
if (multiviewChanged)
OBSProjector::UpdateMultiviewProjectors();
}
void OBSBasicSettings::SaveStream1Settings()
+453 -364
View File
File diff suppressed because it is too large Load Diff
+37 -11
View File
@@ -13,6 +13,14 @@ enum class ProjectorType {
class QMouseEvent;
enum class MultiviewLayout : uint8_t {
HORIZONTAL_TOP_8_SCENES = 0,
HORIZONTAL_BOTTOM_8_SCENES = 1,
VERTICAL_LEFT_8_SCENES = 2,
VERTICAL_RIGHT_8_SCENES = 3,
HORIZONTAL_TOP_24_SCENES = 4
};
class OBSProjector : public OBSQTDisplay {
Q_OBJECT
@@ -31,17 +39,37 @@ private:
bool isWindow;
QString projectorTitle;
ProjectorType type = ProjectorType::Source;
OBSWeakSource multiviewScenes[8];
OBSSource multiviewLabels[10];
gs_vertbuffer_t *outerBox = nullptr;
gs_vertbuffer_t *innerBox = nullptr;
gs_vertbuffer_t *leftVLine = nullptr;
gs_vertbuffer_t *rightVLine = nullptr;
gs_vertbuffer_t *leftLine = nullptr;
gs_vertbuffer_t *topLine = nullptr;
gs_vertbuffer_t *rightLine = nullptr;
std::vector<OBSWeakSource> multiviewScenes;
std::vector<OBSSource> multiviewLabels;
gs_vertbuffer_t *actionSafeMargin = nullptr;
gs_vertbuffer_t *graphicsSafeMargin = nullptr;
gs_vertbuffer_t *fourByThreeSafeMargin = nullptr;
gs_vertbuffer_t *leftLine = nullptr;
gs_vertbuffer_t *topLine = nullptr;
gs_vertbuffer_t *rightLine = nullptr;
gs_effect_t *solid = nullptr;
gs_eparam_t *color = nullptr;
// Multiview position helpers
float thickness = 4;
float offset, thicknessx2 = thickness * 2, pvwprgCX,
pvwprgCY, sourceX, sourceY, labelX, labelY, scenesCX, scenesCY,
ppiCX, ppiCY, siX, siY, siCX, siCY, ppiScaleX, ppiScaleY,
siScaleX, siScaleY, fw, fh, ratio;
float lineLength = 0.1f;
// Rec. ITU-R BT.1848-1 / EBU R 95
float actionSafePercentage = 0.035f; // 3.5%
float graphicsSafePercentage = 0.05f; // 5.0%
float fourByThreeSafePercentage = 0.1625f; // 16.25%
bool ready = false;
// argb colors
static const uint32_t outerColor = 0xFFD0D0D0;
static const uint32_t labelColor = 0xD91F1F1F;
static const uint32_t backgroundColor = 0xFF000000;
static const uint32_t previewColor = 0xFF00D000;
static const uint32_t programColor = 0xFFD00000;
void UpdateMultiview();
void UpdateProjectorTitle(QString name);
@@ -53,8 +81,6 @@ public:
QString title, ProjectorType type_);
~OBSProjector();
void Init();
OBSSource GetSource();
ProjectorType GetProjectorType();
int GetMonitor();