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 - &File + Basic.MainMenu.File - - + @@ -460,7 +459,7 @@ :/res/images/add.ico:/res/images/add.ico - AddScene + Add @@ -469,7 +468,7 @@ :/res/images/add.ico:/res/images/add.ico - AddSource + Add @@ -478,7 +477,7 @@ :/res/images/list_remove.png:/res/images/list_remove.png - RemoveScene + Remove @@ -487,7 +486,7 @@ :/res/images/list_remove.png:/res/images/list_remove.png - RemoveSource + Remove @@ -499,7 +498,7 @@ :/res/images/properties.ico:/res/images/properties.ico - SceneProperties + Properties @@ -511,7 +510,7 @@ :/res/images/properties.ico:/res/images/properties.ico - SourceProperties + Properties @@ -523,7 +522,7 @@ :/res/images/up.ico:/res/images/up.ico - SceneMoveUp + Basic.Main.MoveUp @@ -535,7 +534,7 @@ :/res/images/up.ico:/res/images/up.ico - SourceMoveUp + MoveUp @@ -547,7 +546,7 @@ :/res/images/down.ico:/res/images/down.ico - SceneMoveDown + Basic.Main.MoveDown @@ -559,32 +558,32 @@ :/res/images/down.ico:/res/images/down.ico - SourceMoveDown + MoveDown - &New + Basic.MainMenu.SwitchMode - &Open + Basic.MainMenu.File.Export - &Save + Basic.MainMenu.File.Import - Settings + Basic.MainMenu.File.Settings - E&xit + Basic.MainMenu.File.Exit 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 +