From 9f0c48d9c79a768d878905f60ff842e271da05d1 Mon Sep 17 00:00:00 2001 From: cg2121 Date: Thu, 8 Dec 2016 17:09:22 -0600 Subject: [PATCH] UI: Add import/export of scene collections & profiles Closes jp9000/obs-studio#721 --- UI/data/locale/en-US.ini | 8 +++ UI/forms/OBSBasic.ui | 24 +++++++ UI/window-basic-main-profiles.cpp | 80 ++++++++++++++++++++++ UI/window-basic-main-scene-collections.cpp | 63 +++++++++++++++++ UI/window-basic-main.hpp | 4 ++ 5 files changed, 179 insertions(+) diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini index c16b6714a..92bfdec13 100644 --- a/UI/data/locale/en-US.ini +++ b/UI/data/locale/en-US.ini @@ -59,6 +59,8 @@ Minutes="Minutes" Seconds="Seconds" Deprecated="Deprecated" ReplayBuffer="Replay Buffer" +Import="Import" +Export="Export" # quick transitions QuickTransitions.SwapScenes="Swap Preview/Output Scenes After Transitioning" @@ -370,6 +372,12 @@ Basic.MainMenu.View.StatusBar="&Status Bar" # basic mode profile/scene collection menus Basic.MainMenu.SceneCollection="&Scene Collection" Basic.MainMenu.Profile="&Profile" +Basic.MainMenu.Profile.Import="Import Profile" +Basic.MainMenu.Profile.Export="Export Profile" +Basic.MainMenu.SceneCollection.Import="Import Scene Collection" +Basic.MainMenu.SceneCollection.Export="Export Scene Collection" +Basic.MainMenu.Profile.Exists="The profile already exists" +Basic.MainMenu.SceneCollection.Exists="The scene collection already exists" # basic mode help menu Basic.MainMenu.Tools="&Tools" diff --git a/UI/forms/OBSBasic.ui b/UI/forms/OBSBasic.ui index d89016294..912aa338a 100644 --- a/UI/forms/OBSBasic.ui +++ b/UI/forms/OBSBasic.ui @@ -898,6 +898,8 @@ + + @@ -908,6 +910,8 @@ + + @@ -1273,6 +1277,16 @@ Remove + + + Import + + + + + Export + + New @@ -1293,6 +1307,16 @@ Remove + + + Import + + + + + Export + + Basic.MainMenu.File.ShowSettingsFolder diff --git a/UI/window-basic-main-profiles.cpp b/UI/window-basic-main-profiles.cpp index 9637fca34..adf5e1ee9 100644 --- a/UI/window-basic-main-profiles.cpp +++ b/UI/window-basic-main-profiles.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "window-basic-main.hpp" #include "window-namedialog.hpp" #include "qt-wrappers.hpp" @@ -448,6 +449,85 @@ void OBSBasic::on_actionRemoveProfile_triggered() } } +void OBSBasic::on_actionImportProfile_triggered() +{ + char path[512]; + + QString home = QDir::homePath(); + + int ret = GetConfigPath(path, 512, "obs-studio/basic/profiles/"); + if (ret <= 0) { + blog(LOG_WARNING, "Failed to get profile config path"); + return; + } + + QString dir = QFileDialog::getExistingDirectory( + this, + QTStr("Basic.MainMenu.Profile.Import"), + home, + QFileDialog::ShowDirsOnly | + QFileDialog::DontResolveSymlinks); + + if (!dir.isEmpty() && !dir.isNull()) { + QString inputPath = QString::fromUtf8(path); + QFileInfo finfo(dir); + QString directory = finfo.fileName(); + QString profileDir = inputPath + directory; + QDir folder(profileDir); + + if (!folder.exists()) { + folder.mkpath(profileDir); + QFile::copy(dir + "/basic.ini", + profileDir + "/basic.ini"); + QFile::copy(dir + "/service.json", + profileDir + "/service.json"); + RefreshProfiles(); + } else { + QMessageBox::information(this, + QTStr("Basic.MainMenu.Profile.Import"), + QTStr("Basic.MainMenu.Profile.Exists")); + } + } +} + +void OBSBasic::on_actionExportProfile_triggered() +{ + char path[512]; + + QString home = QDir::homePath(); + + QString currentProfile = + QString::fromUtf8(config_get_string(App()->GlobalConfig(), + "Basic", "ProfileDir")); + + int ret = GetConfigPath(path, 512, "obs-studio/basic/profiles/"); + if (ret <= 0) { + blog(LOG_WARNING, "Failed to get profile config path"); + return; + } + + QString dir = QFileDialog::getExistingDirectory( + this, + QTStr("Basic.MainMenu.Profile.Export"), + home, + QFileDialog::ShowDirsOnly | + QFileDialog::DontResolveSymlinks); + + if (!dir.isEmpty() && !dir.isNull()) { + QString outputDir = dir + "/" + currentProfile; + QString inputPath = QString::fromUtf8(path); + QDir folder(outputDir); + + if (!folder.exists()) { + folder.mkpath(outputDir); + QFile::copy(inputPath + currentProfile + "/basic.ini", + outputDir + "/basic.ini"); + QFile::copy(inputPath + currentProfile + "/service.json", + outputDir + "/service.json"); + } + } +} + void OBSBasic::ChangeProfile() { QAction *action = reinterpret_cast(sender()); diff --git a/UI/window-basic-main-scene-collections.cpp b/UI/window-basic-main-scene-collections.cpp index 909ad2215..0c294df3d 100644 --- a/UI/window-basic-main-scene-collections.cpp +++ b/UI/window-basic-main-scene-collections.cpp @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include "item-widget-helpers.hpp" #include "window-basic-main.hpp" #include "window-namedialog.hpp" @@ -347,6 +349,67 @@ void OBSBasic::on_actionRemoveSceneCollection_triggered() } } +void OBSBasic::on_actionImportSceneCollection_triggered() +{ + char path[512]; + + QString home = QDir::homePath(); + + int ret = GetConfigPath(path, 512, "obs-studio/basic/scenes/"); + if (ret <= 0) { + blog(LOG_WARNING, "Failed to get scene collection config path"); + return; + } + + QString file = QFileDialog::getOpenFileName( + this, + QTStr("Basic.MainMenu.SceneCollection.Import"), + home, + "JSON Files (*.json)"); + + QFileInfo finfo(file); + QString filename = finfo.fileName(); + QFileInfo destinfo(path + filename); + + if (!file.isEmpty() && !file.isNull()) { + if (!destinfo.exists()) { + QFile::copy(file, path + filename); + RefreshSceneCollections(); + } else { + QMessageBox::information(this, + QTStr("Basic.MainMenu.SceneCollection.Import"), + QTStr("Basic.MainMenu.SceneCollection.Exists")); + } + } +} + +void OBSBasic::on_actionExportSceneCollection_triggered() +{ + char path[512]; + + QString home = QDir::homePath(); + + QString currentFile = QT_UTF8(config_get_string(App()->GlobalConfig(), + "Basic", "SceneCollectionFile")); + + int ret = GetConfigPath(path, 512, "obs-studio/basic/scenes/"); + if (ret <= 0) { + blog(LOG_WARNING, "Failed to get scene collection config path"); + return; + } + + QString exportFile = QFileDialog::getSaveFileName( + 0, + QTStr("Basic.MainMenu.SceneCollection.Export"), + home + "/" + currentFile, + "JSON Files (*.json)"); + + string file = QT_TO_UTF8(exportFile); + + if (!exportFile.isEmpty() && !exportFile.isNull()) + QFile::copy(path + currentFile + ".json", exportFile); +} + void OBSBasic::ChangeSceneCollection() { QAction *action = reinterpret_cast(sender()); diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index 1cdf9c0e8..33591ffc0 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -552,11 +552,15 @@ private slots: void on_actionDupSceneCollection_triggered(); void on_actionRenameSceneCollection_triggered(); void on_actionRemoveSceneCollection_triggered(); + void on_actionImportSceneCollection_triggered(); + void on_actionExportSceneCollection_triggered(); void on_actionNewProfile_triggered(); void on_actionDupProfile_triggered(); void on_actionRenameProfile_triggered(); void on_actionRemoveProfile_triggered(); + void on_actionImportProfile_triggered(); + void on_actionExportProfile_triggered(); void on_actionShowSettingsFolder_triggered(); void on_actionShowProfileFolder_triggered();