diff --git a/build/data/obs-studio/locale/en.txt b/build/data/obs-studio/locale/en.txt
index fb6368e1e..742917391 100644
--- a/build/data/obs-studio/locale/en.txt
+++ b/build/data/obs-studio/locale/en.txt
@@ -1,76 +1,111 @@
+# Language and language region of this file
Language="English"
+Region="United States"
-DesktopDevice1="Desktop Audio"
-DesktopDevice2="Desktop Audio 2"
-AuxDevice1="Mic/Aux"
-AuxDevice2="Mic/Aux 2"
-AuxDevice3="Mic/Aux 3"
-AuxDevice4="Mic/Aux 4"
-
-Studio.Basic.Scene="Scene"
-Studio.Basic.DisplayCapture="Display Capture"
-
-MainMenu.File="File"
-
-MainMenu.File.New="New"
-MainMenu.File.Open="Open"
-MainMenu.FIle.Save="Save"
-
-MainWindow.AddSceneDlg.Title="Add Scene"
-MainWindow.AddSceneDlg.Text="Please enter the name of the scene"
-
-MainWindow.AddSourceDlg.Title="Add Source"
-MainWindow.AddSourceDlg.Text="Please enter the name of the source"
-
-MainWindow.NameExists.Title="Name already exists"
-MainWindow.NameExists.Text="The name is already in use by another source."
-
-MainWindow.NoNameEntered="Please enter a valid name"
-
-MainWindow.Exit="Exit"
-MainWindow.Lock="Lock Preview"
-MainWindow.Preview="Enable Preview"
-MainWindow.Scenes="Scenes:"
-MainWindow.Settings="Settings"
-MainWindow.Sources="Sources:"
-MainWindow.StartRecording="Start Recording"
-MainWindow.StartStream="Start Stream"
-MainWindow.StopRecording="Stop Recording"
-MainWindow.StopStream="Stop Stream"
-MainWindow.Volume="Volume:"
-
+# commonly shared locale
+OK="OK"
+Apply="Apply"
+Cancel="Cancel"
+Yes="Yes"
+No="No"
+Add="Add"
+Remove="Remove"
+Properties="Properties"
+MoveUp="Move Up"
+MoveDown="Move Down"
Settings="Settings"
+Exit="Exit"
+Volume="Volume"
+Browse="Browse"
+Mono="Mono"
+Stereo="Stereo"
-Settings.ProgramRestart="The program must be restarted for these settings to take effect."
-Settings.ConfirmTitle="Confirm Changes"
-Settings.Confirm="You have unsaved changes. Save changes?"
+# "name already exists" dialog box
+NameExists.Title="Name already exists"
+NameExists.Text="The name is already in use."
-Settings.General="General"
-Settings.General.Language="Language:"
+NoNameEntered="Please enter a valid name"
-Settings.Streams="Streams"
-Settings.Streams.AddName.Title="Add Stream"
-Settings.Streams.AddName.Text="Please enter the name of the stream"
-Settings.Streams.Exists.Title="Stream already exists"
-Settings.Streams.Exists.Text="The name is already in use by another stream"
+# audio device names
+Basic.DesktopDevice1="Desktop Audio"
+Basic.DesktopDevice2="Desktop Audio 2"
+Basic.AuxDevice1="Mic/Aux"
+Basic.AuxDevice2="Mic/Aux 2"
+Basic.AuxDevice3="Mic/Aux 3"
+Basic.AuxDevice4="Mic/Aux 4"
-Settings.Outputs="Outputs"
+# startup scene/capture
+Basic.Scene="Scene"
+Basic.DisplayCapture="Display Capture"
-Settings.Video="Video"
-Settings.Video.Adapter="Video Adapter:"
-Settings.Video.BaseRes="Base Resolution:"
-Settings.Video.OutputRes="Output Resolution:"
-Settings.Video.DownscaleFilter="Downscale Filter:"
-Settings.Video.DisableAeroWindows="Disable Aero (Windows only)"
-Settings.Video.FPS="FPS:"
-Settings.Video.FPS.Common="Common FPS Values"
-Settings.Video.FPS.Integer="Integer FPS Value"
-Settings.Video.FPS.Fraction="Fractional FPS Value"
-Settings.Video.FPS.Nanoseconds="Frame Interval (nanoseconds)"
-Settings.Video.FPS.Numerator="Numerator:"
-Settings.Video.FPS.Denominator="Denominator:"
-Settings.Video.Renderer="Renderer:"
-Settings.Video.InvalidResolution="Invalid resolution value. Must be [width]x[height] (i.e. 1920x1080)"
-Settings.Video.CurrentlyActive="Video output is currently active. Please turn off any outputs to change video settings."
+# add scene dialog
+Basic.Main.AddSceneDlg.Title="Add Scene"
+Basic.Main.AddSceneDlg.Text="Please enter the name of the scene"
-Settings.Audio="Audio"
+# add source dialog
+Basic.SourceSelect.CreateNew="Create new"
+Basic.SourceSelect.AddExisting="Add Existing"
+
+# basic mode main window
+Basic.Main.Scenes="Scenes"
+Basic.Main.Sources="Sources"
+Basic.Main.StartRecording="Start Recording"
+Basic.Main.StartStreaming="Start Streaming"
+Basic.Main.StopRecording="Stop Recording"
+Basic.Main.StopStreaming="Stop Streaming"
+
+# basic mode menu
+Basic.MainMenu.File="&File"
+Basic.MainMenu.File.Export="&Export"
+Basic.MainMenu.File.Import="&Import"
+Basic.MainMenu.File.Settings="&Settings"
+Basic.MainMenu.File.Exit="E&xit"
+
+# basic mode settings dialog
+Basic.Settings.ProgramRestart="The program must be restarted for these settings to take effect."
+Basic.Settings.ConfirmTitle="Confirm Changes"
+Basic.Settings.Confirm="You have unsaved changes. Save changes?"
+
+# basic mode 'general' settings
+Basic.Settings.General="General"
+Basic.Settings.General.Language="Language:"
+
+# basic mode 'stream' settings
+Basic.Settings.Stream="Stream"
+Basic.Settings.Stream.StreamType="Stream Type"
+
+# basic mode 'output' settings
+Basic.Settings.Output="Output"
+Basic.Settings.Output.Mode="Output Mode"
+Basic.Settings.Output.Mode.Simple="Simple (Stream and/or record)"
+Basic.Settings.Output.Mode.Advanced="Advanced (Custom output type)"
+Basic.Settings.Output.Simple.SavePath="Recording Path"
+Basic.Settings.Output.Simple.VideoBitrate="Video Bitrate"
+Basic.Settings.output.Simple.AudioBitrate="Audio Bitrate"
+
+# basic mode 'video' settings
+Basic.Settings.Video="Video"
+Basic.Settings.Video.Adapter="Video Adapter:"
+Basic.Settings.Video.BaseResolution="Base Resolution:"
+Basic.Settings.Video.ScaledResolution="Scaled Resolution:"
+Basic.Settings.Video.DownscaleFilter="Downscale Filter:"
+Basic.Settings.Video.DisableAeroWindows="Disable Aero (Windows only)"
+Basic.Settings.Video.FPS="FPS:"
+Basic.Settings.Video.FPSCommon="Common FPS Values"
+Basic.Settings.Video.FPSInteger="Integer FPS Value"
+Basic.Settings.Video.FPSFraction="Fractional FPS Value"
+Basic.Settings.Video.Numerator="Numerator:"
+Basic.Settings.Video.Denominator="Denominator:"
+Basic.Settings.Video.Renderer="Renderer:"
+Basic.Settings.Video.InvalidResolution="Invalid resolution value. Must be [width]x[height] (i.e. 1920x1080)"
+Basic.Settings.Video.CurrentlyActive="Video output is currently active. Please turn off any outputs to change video settings."
+
+# basic mode 'audio' settings
+Basic.Settings.Audio="Audio"
+Basic.Settings.Audio.SampleRate="Sample Rate"
+Basic.Settings.Audio.Channels="Channels"
+Basic.Settings.Audio.DesktopDevice="Desktop Audio Device"
+Basic.Settings.Audio.DesktopDevice2="Desktop Audio Device 2"
+Basic.Settings.Audio.AuxDevice="Mic/Auxilary Audio Device"
+Basic.Settings.Audio.AuxDevice2="Mic/Auxilary Audio Device 2"
+Basic.Settings.Audio.AuxDevice3="Mic/Auxilary Audio Device 3"
diff --git a/obs/CMakeLists.txt b/obs/CMakeLists.txt
index 37d40e87e..abe2ea9e1 100644
--- a/obs/CMakeLists.txt
+++ b/obs/CMakeLists.txt
@@ -57,6 +57,7 @@ set(obs_SOURCES
window-basic-main.cpp
window-basic-settings.cpp
window-basic-properties.cpp
+ window-basic-source-select.cpp
window-namedialog.cpp
properties-view.cpp
volume-control.cpp
@@ -69,6 +70,7 @@ set(obs_HEADERS
window-basic-main.hpp
window-basic-settings.hpp
window-basic-properties.hpp
+ window-basic-source-select.hpp
window-namedialog.hpp
properties-view.hpp
display-helpers.hpp
@@ -80,6 +82,7 @@ set(obs_UI
forms/NameDialog.ui
forms/OBSBasic.ui
forms/OBSBasicSettings.ui
+ forms/OBSBasicSourceSelect.ui
forms/OBSBasicProperties.ui)
set(obs_QRC
diff --git a/obs/forms/OBSBasic.ui b/obs/forms/OBSBasic.ui
index a457f3f1d..add0b0f06 100644
--- a/obs/forms/OBSBasic.ui
+++ b/obs/forms/OBSBasic.ui
@@ -24,7 +24,7 @@
- MainWindow
+ .MainWindow
@@ -107,7 +107,7 @@
-
- Scenes
+ Basic.Main.Scenes
@@ -215,7 +215,7 @@
-
- Sources
+ Basic.Main.Sources
@@ -322,7 +322,7 @@
0
0
- 233
+ 148
16
@@ -391,7 +391,7 @@
true
- Start Streaming
+ Basic.Main.StartStreaming
false
@@ -404,7 +404,7 @@
false
- Start Recording
+ Basic.Main.StartRecording
@@ -436,16 +436,15 @@
0
0
927
- 24
+ 22
diff --git a/obs/forms/OBSBasicSettings.ui b/obs/forms/OBSBasicSettings.ui
index bfd297e89..4ff253f15 100644
--- a/obs/forms/OBSBasicSettings.ui
+++ b/obs/forms/OBSBasicSettings.ui
@@ -6,7 +6,7 @@
0
0
- 752
+ 770
602
@@ -17,7 +17,7 @@
- Settings
+ Basic.Settings
-
@@ -44,7 +44,7 @@
-
- General
+ Basic.Settings.General
@@ -53,7 +53,7 @@
-
- Stream
+ Basic.Settings.Stream
@@ -62,7 +62,7 @@
-
- Output
+ Basic.Settings.Output
@@ -71,7 +71,7 @@
-
- Audio
+ Basic.Settings.Audio
@@ -80,7 +80,7 @@
-
- Video
+ Basic.Settings.Video
@@ -92,10 +92,13 @@
-
- 2
+ 0
+
+ QFormLayout::AllNonFixedFieldsGrow
+
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -119,12 +122,12 @@
- 150
+ 170
0
- Language:
+ Basic.Settings.General.Language
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -204,7 +207,7 @@
- Stream Type
+ Basic.Settings.Stream.StreamType
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -267,7 +270,7 @@
- Mode
+ Basic.Settings.Output.Mode
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -290,12 +293,12 @@
-
- Simple
+ Basic.Settings.Output.Mode.Simple
-
- Custom
+ Basic.Settings.Output.Mode.Custom
@@ -368,7 +371,7 @@
- Save Path
+ Basic.Settings.Output.Simple.SavePath
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -399,7 +402,7 @@
-
- Video Bitrate
+ Basic.Settings.Output.Simple.VideoBitrate
@@ -419,7 +422,7 @@
-
- Audio Bitrate
+ Basic.Settings.Output.Simple.AudioBitrate
@@ -485,13 +488,16 @@
+
+ QFormLayout::AllNonFixedFieldsGrow
+
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
- Sample Rate:
+ Basic.Settings.Audio.SampleRate
@@ -523,17 +529,17 @@
-
- Channels:
+ Basic.Settings.Audio.Channels
-
- Stereo
+ Mono
- 1
+ 0
-
@@ -556,7 +562,7 @@
- Desktop Audio Device 1:
+ Basic.Settings.Audio.DesktopDevice
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -573,7 +579,7 @@
-
- Desktop Audio Device 2:
+ Basic.Settings.Audio.DesktopDevice2
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -590,7 +596,7 @@
-
- Mic/Aux Audio Device 1:
+ Basic.Settings.Audio.AuxDevice
@@ -604,7 +610,7 @@
-
- Mic/Aux Audio Device 2:
+ Basic.Settings.Audio.AuxDevice2
@@ -618,7 +624,7 @@
-
- Mic/Aux Audio Device 3:
+ Basic.Settings.Audio.AuxDevice3
@@ -646,13 +652,16 @@
+
+ QFormLayout::AllNonFixedFieldsGrow
+
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
- Renderer:
+ Basic.Settings.Video.Renderer
@@ -672,7 +681,7 @@
- Video Adapter:
+ Basic.Settings.Video.Adapter
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -692,7 +701,7 @@
-
- Base Resolution:
+ Basic.Settings.Video.BaseResolution
@@ -715,7 +724,7 @@
-
- Output Resolution:
+ Basic.Settings.Video.ScaledResolution
@@ -739,7 +748,7 @@
-
- Downscale Filter:
+ Basic.Settings.Video.DownscaleFilter
@@ -752,24 +761,24 @@
- FPS (Common)
+ Basic.Settings.Video.FPSCommon
QComboBox::AdjustToContents
-
- FPS (Common)
+ Basic.Settings.Video.FPSCommon
-
- FPS (Integer)
+ Basic.Settings.Video.FPSInteger
-
- FPS (Fractional)
+ Basic.Settings.Video.FPSFraction
@@ -777,7 +786,7 @@
-
- 0
+ 2
@@ -871,6 +880,9 @@
+
+ QFormLayout::ExpandingFieldsGrow
+
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -912,14 +924,14 @@
-
- Numerator:
+ Basic.Settings.Video.Numerator
-
- Denomniator:
+ Basic.Settings.Video.Denominator
diff --git a/obs/forms/OBSBasicSourceSelect.ui b/obs/forms/OBSBasicSourceSelect.ui
new file mode 100644
index 000000000..a2bafd58a
--- /dev/null
+++ b/obs/forms/OBSBasicSourceSelect.ui
@@ -0,0 +1,98 @@
+
+
+ OBSBasicSourceSelect
+
+
+ Qt::WindowModal
+
+
+
+ 0
+ 0
+ 352
+ 314
+
+
+
+ Basic.SourceSelect
+
+
+ -
+
+
-
+
+
+ Basic.SourceSelect.CreateNew
+
+
+ true
+
+
+
+ -
+
+
+ -
+
+
+ Basic.SourceSelect.AddExisting
+
+
+
+ -
+
+
+ false
+
+
+ true
+
+
+
+
+
+ -
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+
+
+
+
+
+ radioButton
+ toggled(bool)
+ sourceName
+ setEnabled(bool)
+
+
+ 79
+ 29
+
+
+ 108
+ 53
+
+
+
+
+ selectExisting
+ toggled(bool)
+ sourceList
+ setEnabled(bool)
+
+
+ 51
+ 80
+
+
+ 65
+ 128
+
+
+
+
+
diff --git a/obs/obs-app.cpp b/obs/obs-app.cpp
index dd41d6c20..2f8cc695f 100644
--- a/obs/obs-app.cpp
+++ b/obs/obs-app.cpp
@@ -163,8 +163,6 @@ OBSApp::OBSApp(int &argc, char **argv)
throw "Failed to initialize global config";
if (!InitLocale())
throw "Failed to load locale";
-
- mainWindow = move(unique_ptr(new OBSBasic()));
}
const char *OBSApp::GetRenderModule() const
@@ -180,6 +178,7 @@ const char *OBSApp::GetRenderModule() const
void OBSApp::OBSInit()
{
+ mainWindow = move(unique_ptr(new OBSBasic()));
mainWindow->OBSInit();
}
@@ -204,6 +203,19 @@ const char *OBSApp::OutputAudioSource() const
return OUTPUT_AUDIO_SOURCE;
}
+QString OBSTranslator::translate(const char *context, const char *sourceText,
+ const char *disambiguation, int n) const
+{
+ const char *out = nullptr;
+ if (!text_lookup_getstr(App()->GetTextLookup(), sourceText, &out))
+ return QString();
+
+ UNUSED_PARAMETER(context);
+ UNUSED_PARAMETER(disambiguation);
+ UNUSED_PARAMETER(n);
+ return QT_UTF8(out);
+}
+
struct NoFocusFrameStyle : QProxyStyle
{
void drawControl(ControlElement element, const QStyleOption *option,
@@ -239,6 +251,8 @@ int main(int argc, char *argv[])
try {
OBSApp program(argc, argv);
+ OBSTranslator test;
+ program.installTranslator(&test);
program.setStyle(new NoFocusFrameStyle);
program.OBSInit();
ret = program.exec();
diff --git a/obs/obs-app.hpp b/obs/obs-app.hpp
index c82961b4b..bf7039c4f 100644
--- a/obs/obs-app.hpp
+++ b/obs/obs-app.hpp
@@ -18,12 +18,23 @@
#pragma once
#include
+#include
#include
#include
#include
#include "window-main.hpp"
+class OBSTranslator : public QTranslator {
+ Q_OBJECT
+
+public:
+ virtual bool isEmpty() const override {return false;}
+
+ virtual QString translate(const char *context, const char *sourceText,
+ const char *disambiguation, int n) const override;
+};
+
class OBSApp : public QApplication {
Q_OBJECT
@@ -51,6 +62,8 @@ public:
return locale.c_str();
}
+ inline lookup_t GetTextLookup() const {return textLookup;}
+
inline const char *GetString(const char *lookupVal) const
{
return textLookup.GetString(lookupVal);
diff --git a/obs/window-basic-main.cpp b/obs/window-basic-main.cpp
index 79cc7a655..3a13ea11c 100644
--- a/obs/window-basic-main.cpp
+++ b/obs/window-basic-main.cpp
@@ -28,6 +28,7 @@
#include "platform.hpp"
#include "window-basic-settings.hpp"
#include "window-namedialog.hpp"
+#include "window-basic-source-select.hpp"
#include "window-basic-main.hpp"
#include "window-basic-properties.hpp"
#include "qt-wrappers.hpp"
@@ -153,8 +154,6 @@ void OBSBasic::CreateDefaultScene()
Str("Studio.Basic.DisplayCapture"), NULL);
if (source) {
- sourceSceneRefs[source] = 0;
-
obs_scene_add(scene, source);
obs_add_source(source);
obs_source_release(source);
@@ -652,12 +651,15 @@ void OBSBasic::SceneItemRemoved(void *data, calldata_t params)
void OBSBasic::SourceAdded(void *data, calldata_t params)
{
+ OBSBasic *window = static_cast(data);
obs_source_t source = (obs_source_t)calldata_ptr(params, "source");
if (obs_scene_fromsource(source) != NULL)
- QMetaObject::invokeMethod(static_cast(data),
+ QMetaObject::invokeMethod(window,
"AddScene",
Q_ARG(OBSSource, OBSSource(source)));
+ else
+ window->sourceSceneRefs[source] = 0;
}
void OBSBasic::SourceRemoved(void *data, calldata_t params)
@@ -1029,59 +1031,19 @@ void OBSBasic::on_sources_customContextMenuRequested(const QPoint &pos)
UNUSED_PARAMETER(pos);
}
-void OBSBasic::AddSource(obs_scene_t scene, const char *id)
+void OBSBasic::AddSource(const char *id)
{
- string name;
-
- bool success = false;
- while (!success) {
- bool accepted = NameDialog::AskForName(this,
- Str("MainWindow.AddSourceDlg.Title"),
- Str("MainWindow.AddSourceDlg.Text"),
- name);
-
- if (!accepted)
- break;
-
- if (name.empty()) {
- QMessageBox::information(this,
- QTStr("MainWindow.NoNameEntered"),
- QTStr("MainWindow.NoNameEntered"));
- continue;
- }
-
- obs_source_t source = obs_get_source_by_name(name.c_str());
- if (!source) {
- success = true;
- break;
- } else {
- QMessageBox::information(this,
- QTStr("MainWindow.NameExists.Title"),
- QTStr("MainWindow.NameExists.Text"));
- obs_source_release(source);
- }
- }
-
- if (success) {
- obs_source_t source = obs_source_create(OBS_SOURCE_TYPE_INPUT,
- id, name.c_str(), NULL);
-
- sourceSceneRefs[source] = 0;
-
- obs_add_source(source);
- obs_scene_add(scene, source);
- obs_source_release(source);
- }
+ OBSBasicSourceSelect sourceSelect(this, id);
+ sourceSelect.exec();
}
void OBSBasic::AddSourcePopupMenu(const QPoint &pos)
{
- OBSScene scene = GetCurrentScene();
const char *type;
bool foundValues = false;
size_t idx = 0;
- if (!scene)
+ if (!GetCurrentScene())
return;
QMenu popup;
@@ -1103,7 +1065,7 @@ void OBSBasic::AddSourcePopupMenu(const QPoint &pos)
if (foundValues) {
QAction *ret = popup.exec(pos);
if (ret)
- AddSource(scene, ret->data().toString().toUtf8());
+ AddSource(ret->data().toString().toUtf8());
}
}
diff --git a/obs/window-basic-main.hpp b/obs/window-basic-main.hpp
index c43fb05a5..b16a9f849 100644
--- a/obs/window-basic-main.hpp
+++ b/obs/window-basic-main.hpp
@@ -124,7 +124,7 @@ private:
void ResizePreview(uint32_t cx, uint32_t cy);
- void AddSource(obs_scene_t scene, const char *id);
+ void AddSource(const char *id);
void AddSourcePopupMenu(const QPoint &pos);
public:
diff --git a/obs/window-basic-settings.cpp b/obs/window-basic-settings.cpp
index a7452ba40..09f9cec91 100644
--- a/obs/window-basic-settings.cpp
+++ b/obs/window-basic-settings.cpp
@@ -363,7 +363,8 @@ void OBSBasicSettings::LoadVideoSettings()
if (video_output_active(obs_video())) {
ui->videoPage->setEnabled(false);
- ui->videoMsg->setText(QTStr("Settings.Video.CurrentlyActive"));
+ ui->videoMsg->setText(
+ QTStr("Basic.Settings.Video.CurrentlyActive"));
}
LoadRendererList();
@@ -634,8 +635,8 @@ bool OBSBasicSettings::QueryChanges()
QMessageBox::StandardButton button;
button = QMessageBox::question(this,
- QTStr("Settings.ConfirmTitle"),
- QTStr("Settings.Confirm"),
+ QTStr("Basic.Settings.ConfirmTitle"),
+ QTStr("Basic.Settings.Confirm"),
QMessageBox::Yes | QMessageBox::No |
QMessageBox::Cancel);
@@ -711,6 +712,8 @@ static inline bool StreamExists(const char *name)
return obs_get_service_by_name(name) != nullptr;
}
+#define INVALID_RES_STR "Basic.Settings.Video.InvalidResolution"
+
static bool ValidResolutions(Ui::OBSBasicSettings *ui)
{
QString baseRes = ui->baseResolution->lineEdit()->text();
@@ -720,8 +723,7 @@ static bool ValidResolutions(Ui::OBSBasicSettings *ui)
if (!ConvertResText(QT_TO_UTF8(baseRes), cx, cy) ||
!ConvertResText(QT_TO_UTF8(outputRes), cx, cy)) {
- ui->videoMsg->setText(
- QTStr("Settings.Video.InvalidResolution"));
+ ui->videoMsg->setText(QTStr(INVALID_RES_STR));
return false;
}
@@ -762,7 +764,7 @@ void OBSBasicSettings::AudioChangedRestart()
{
if (!loading) {
audioChanged = true;
- ui->audioMsg->setText(QTStr("Settings.ProgramRestart"));
+ ui->audioMsg->setText(QTStr("Basic.Settings.ProgramRestart"));
}
}
@@ -770,7 +772,7 @@ void OBSBasicSettings::VideoChangedRestart()
{
if (!loading) {
videoChanged = true;
- ui->videoMsg->setText(QTStr("Settings.ProgramRestart"));
+ ui->videoMsg->setText(QTStr("Basic.Settings.ProgramRestart"));
}
}
diff --git a/obs/window-basic-source-select.cpp b/obs/window-basic-source-select.cpp
new file mode 100644
index 000000000..d74d12a2e
--- /dev/null
+++ b/obs/window-basic-source-select.cpp
@@ -0,0 +1,147 @@
+/******************************************************************************
+ Copyright (C) 2014 by Hugh Bailey
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+******************************************************************************/
+
+#include "window-basic-main.hpp"
+#include "window-basic-source-select.hpp"
+#include "qt-wrappers.hpp"
+
+bool OBSBasicSourceSelect::EnumSources(void *data, obs_source_t source)
+{
+ OBSBasicSourceSelect *window = static_cast(data);
+ const char *name = obs_source_getname(source);
+ const char *type;
+
+ obs_source_gettype(source, nullptr, &type);
+
+ if (strcmp(type, window->type) == 0)
+ window->ui->sourceList->addItem(QT_UTF8(name));
+
+ return true;
+}
+
+void OBSBasicSourceSelect::OBSSourceAdded(void *data, calldata_t calldata)
+{
+ OBSBasicSourceSelect *window = static_cast(data);
+ obs_source_t source = (obs_source_t)calldata_ptr(calldata, "source");
+
+ QMetaObject::invokeMethod(window, "SourceAdded",
+ Q_ARG(OBSSource, source));
+}
+
+void OBSBasicSourceSelect::OBSSourceRemoved(void *data, calldata_t calldata)
+{
+ OBSBasicSourceSelect *window = static_cast(data);
+ obs_source_t source = (obs_source_t)calldata_ptr(calldata, "source");
+
+ QMetaObject::invokeMethod(window, "SourceRemoved",
+ Q_ARG(OBSSource, source));
+}
+
+void OBSBasicSourceSelect::SourceAdded(OBSSource source)
+{
+ const char *name = obs_source_getname(source);
+ const char *sourceType;
+
+ obs_source_gettype(source, nullptr, &sourceType);
+ if (strcmp(sourceType, type) != 0)
+ return;
+
+ ui->sourceList->addItem(name);
+}
+
+void OBSBasicSourceSelect::SourceRemoved(OBSSource source)
+{
+ const char *name = obs_source_getname(source);
+ const char *sourceType;
+
+ obs_source_gettype(source, nullptr, &sourceType);
+ if (strcmp(sourceType, type) != 0)
+ return;
+
+ QList items =
+ ui->sourceList->findItems(name, Qt::MatchFixedString);
+
+ if (!items.count())
+ return;
+
+ delete items[0];
+}
+
+static void AddExisting(const char *name)
+{
+ obs_source_t source = obs_get_output_source(0);
+ obs_scene_t scene = obs_scene_fromsource(source);
+ if (!scene)
+ return;
+
+ source = obs_get_source_by_name(name);
+ if (source) {
+ obs_scene_add(scene, source);
+ obs_source_release(source);
+ }
+
+ obs_scene_release(scene);
+}
+
+void AddNew(const char *id, const char *name)
+{
+ obs_source_t source = obs_get_output_source(0);
+ obs_scene_t scene = obs_scene_fromsource(source);
+ if (!scene)
+ return;
+
+ source = obs_source_create(OBS_SOURCE_TYPE_INPUT,
+ id, name, NULL);
+
+ obs_add_source(source);
+ obs_scene_add(scene, source);
+ obs_source_release(source);
+
+ obs_scene_release(scene);
+}
+
+void OBSBasicSourceSelect::on_buttonBox_accepted()
+{
+ bool useExisting = ui->selectExisting->isChecked();
+
+ if (useExisting) {
+ QListWidgetItem *item = ui->sourceList->currentItem();
+ if (!item)
+ return;
+
+ AddExisting(QT_TO_UTF8(item->text()));
+ } else {
+ AddNew(type, QT_TO_UTF8(ui->sourceName->text()));
+ }
+
+ done(DialogCode::Accepted);
+}
+
+void OBSBasicSourceSelect::on_buttonBox_rejected()
+{
+ done(DialogCode::Rejected);
+}
+
+OBSBasicSourceSelect::OBSBasicSourceSelect(OBSBasic *parent, const char *type_)
+ : QDialog (parent),
+ ui (new Ui::OBSBasicSourceSelect),
+ type (type_)
+{
+ ui->setupUi(this);
+
+ obs_enum_sources(EnumSources, this);
+}
diff --git a/obs/window-basic-source-select.hpp b/obs/window-basic-source-select.hpp
new file mode 100644
index 000000000..2df599c89
--- /dev/null
+++ b/obs/window-basic-source-select.hpp
@@ -0,0 +1,48 @@
+/******************************************************************************
+ Copyright (C) 2014 by Hugh Bailey
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+******************************************************************************/
+
+#pragma once
+
+#include
+#include
+
+#include "ui_OBSBasicSourceSelect.h"
+
+class OBSBasic;
+
+class OBSBasicSourceSelect : public QDialog {
+ Q_OBJECT
+
+private:
+ std::unique_ptr ui;
+ const char *type;
+
+ static bool EnumSources(void *data, obs_source_t source);
+
+ static void OBSSourceRemoved(void *data, calldata_t calldata);
+ static void OBSSourceAdded(void *data, calldata_t calldata);
+
+private slots:
+ void on_buttonBox_accepted();
+ void on_buttonBox_rejected();
+
+ void SourceAdded(OBSSource source);
+ void SourceRemoved(OBSSource source);
+
+public:
+ OBSBasicSourceSelect(OBSBasic *parent, const char *type);
+};
diff --git a/vs/2013/obs-studio/obs-studio.vcxproj b/vs/2013/obs-studio/obs-studio.vcxproj
index bca644cd7..de0f2742a 100644
--- a/vs/2013/obs-studio/obs-studio.vcxproj
+++ b/vs/2013/obs-studio/obs-studio.vcxproj
@@ -22,6 +22,25 @@
+
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing window-basic-source-select.hpp...
+ .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB "-I.\..\..\..\libobs" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I.\..\..\..\obs"
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing window-basic-source-select.hpp...
+ .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB "-I.\..\..\..\libobs" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I.\..\..\..\obs"
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing window-basic-source-select.hpp...
+ .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB "-I.\..\..\..\libobs" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I.\..\..\..\obs"
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing window-basic-source-select.hpp...
+ .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB "-I.\..\..\..\libobs" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I.\..\..\..\obs"
+
+
$(QTDIR)\bin\moc.exe;%(FullPath)
Moc%27ing qt-display.hpp...
@@ -199,6 +218,7 @@
+
true
@@ -228,6 +248,10 @@
true
true
+
+ true
+ true
+
true
true
@@ -274,6 +298,10 @@
true
true
+
+ true
+ true
+
true
true
@@ -457,6 +485,26 @@
"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"
+
+
+ $(QTDIR)\bin\uic.exe;%(AdditionalInputs)
+ Uic%27ing %(Identity)...
+ .\GeneratedFiles\ui_%(Filename).h;%(Outputs)
+ "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"
+ $(QTDIR)\bin\uic.exe;%(AdditionalInputs)
+ Uic%27ing %(Identity)...
+ .\GeneratedFiles\ui_%(Filename).h;%(Outputs)
+ "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"
+ $(QTDIR)\bin\uic.exe;%(AdditionalInputs)
+ Uic%27ing %(Identity)...
+ .\GeneratedFiles\ui_%(Filename).h;%(Outputs)
+ "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"
+ $(QTDIR)\bin\uic.exe;%(AdditionalInputs)
+ Uic%27ing %(Identity)...
+ .\GeneratedFiles\ui_%(Filename).h;%(Outputs)
+ "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"
+
+
{B12702AD-ABFB-343A-A199-8E24837244A3}
Qt4VSv1.0
diff --git a/vs/2013/obs-studio/obs-studio.vcxproj.filters b/vs/2013/obs-studio/obs-studio.vcxproj.filters
index c91cf97ae..75cab0e16 100644
--- a/vs/2013/obs-studio/obs-studio.vcxproj.filters
+++ b/vs/2013/obs-studio/obs-studio.vcxproj.filters
@@ -77,6 +77,12 @@
Header Files
+
+ Form Files
+
+
+ Header Files
+
@@ -103,6 +109,9 @@
Generated Files
+
+ Generated Files
+
@@ -189,6 +198,15 @@
Source Files
+
+ Source Files
+
+
+ Generated Files\Debug
+
+
+ Generated Files\Release
+