diff --git a/src/general.cpp b/src/general.cpp index 83e5178e..1064fe9d 100644 --- a/src/general.cpp +++ b/src/general.cpp @@ -147,7 +147,10 @@ void AdvSceneSwitcher::closeEvent(QCloseEvent *) } switcher->windowPos = this->pos(); switcher->windowSize = this->size(); - + switcher->macroActionConditionSplitterPosition = + ui->macroActionConditionSplitter->sizes(); + switcher->macroListMacroEditSplitterPosition = + ui->macroListMacroEditSplitter->sizes(); obs_frontend_save(); } @@ -519,6 +522,7 @@ void SwitcherData::loadSettings(obs_data_t *obj) loadSceneTriggers(obj); loadGeneralSettings(obj); loadHotkeys(obj); + loadUISettings(obj); // Reset on startup and scene collection change switcher->lastOpenedTab = -1; @@ -550,6 +554,7 @@ void SwitcherData::saveSettings(obs_data_t *obj) saveSceneTriggers(obj); saveGeneralSettings(obj); saveHotkeys(obj); + saveUISettings(obj); saveVersion(obj, g_GIT_SHA1); } @@ -590,31 +595,6 @@ void SwitcherData::saveGeneralSettings(obs_data_t *obj) obs_data_set_int(obj, "priority10", functionNamesByPriority[10]); obs_data_set_int(obj, "threadPriority", threadPriority); - - obs_data_set_int(obj, "generalTabPos", tabOrder[0]); - obs_data_set_int(obj, "macroTabPos", tabOrder[1]); - obs_data_set_int(obj, "transitionTabPos", tabOrder[2]); - obs_data_set_int(obj, "pauseTabPos", tabOrder[3]); - obs_data_set_int(obj, "titleTabPos", tabOrder[4]); - obs_data_set_int(obj, "exeTabPos", tabOrder[5]); - obs_data_set_int(obj, "regionTabPos", tabOrder[6]); - obs_data_set_int(obj, "mediaTabPos", tabOrder[7]); - obs_data_set_int(obj, "fileTabPos", tabOrder[8]); - obs_data_set_int(obj, "randomTabPos", tabOrder[9]); - obs_data_set_int(obj, "timeTabPos", tabOrder[10]); - obs_data_set_int(obj, "idleTabPos", tabOrder[11]); - obs_data_set_int(obj, "sequenceTabPos", tabOrder[12]); - obs_data_set_int(obj, "audioTabPos", tabOrder[13]); - obs_data_set_int(obj, "videoTabPos", tabOrder[14]); - obs_data_set_int(obj, "networkTabPos", tabOrder[15]); - obs_data_set_int(obj, "sceneGroupTabPos", tabOrder[16]); - obs_data_set_int(obj, "triggerTabPos", tabOrder[17]); - - obs_data_set_bool(obj, "saveWindowGeo", saveWindowGeo); - obs_data_set_int(obj, "windowPosX", windowPos.x()); - obs_data_set_int(obj, "windowPosY", windowPos.y()); - obs_data_set_int(obj, "windowWidth", windowSize.width()); - obs_data_set_int(obj, "windowHeight", windowSize.height()); } void SwitcherData::loadGeneralSettings(obs_data_t *obj) @@ -690,7 +670,68 @@ void SwitcherData::loadGeneralSettings(obs_data_t *obj) obs_data_set_default_int(obj, "threadPriority", QThread::NormalPriority); threadPriority = obs_data_get_int(obj, "threadPriority"); +} +void saveSplitterPos(QList &sizes, obs_data_t *obj, const std::string name) +{ + auto array = obs_data_array_create(); + for (int i = 0; i < sizes.count(); ++i) { + obs_data_t *array_obj = obs_data_create(); + obs_data_set_int(array_obj, "pos", sizes[i]); + obs_data_array_push_back(array, array_obj); + obs_data_release(array_obj); + } + obs_data_set_array(obj, name.c_str(), array); + obs_data_array_release(array); +} + +void loadSplitterPos(QList &sizes, obs_data_t *obj, const std::string name) +{ + obs_data_array_t *array = obs_data_get_array(obj, name.c_str()); + size_t count = obs_data_array_count(array); + for (size_t i = 0; i < count; i++) { + obs_data_t *item = obs_data_array_item(array, i); + sizes << obs_data_get_int(item, "pos"); + obs_data_release(item); + } + obs_data_array_release(array); +} + +void SwitcherData::saveUISettings(obs_data_t *obj) +{ + obs_data_set_int(obj, "generalTabPos", tabOrder[0]); + obs_data_set_int(obj, "macroTabPos", tabOrder[1]); + obs_data_set_int(obj, "transitionTabPos", tabOrder[2]); + obs_data_set_int(obj, "pauseTabPos", tabOrder[3]); + obs_data_set_int(obj, "titleTabPos", tabOrder[4]); + obs_data_set_int(obj, "exeTabPos", tabOrder[5]); + obs_data_set_int(obj, "regionTabPos", tabOrder[6]); + obs_data_set_int(obj, "mediaTabPos", tabOrder[7]); + obs_data_set_int(obj, "fileTabPos", tabOrder[8]); + obs_data_set_int(obj, "randomTabPos", tabOrder[9]); + obs_data_set_int(obj, "timeTabPos", tabOrder[10]); + obs_data_set_int(obj, "idleTabPos", tabOrder[11]); + obs_data_set_int(obj, "sequenceTabPos", tabOrder[12]); + obs_data_set_int(obj, "audioTabPos", tabOrder[13]); + obs_data_set_int(obj, "videoTabPos", tabOrder[14]); + obs_data_set_int(obj, "networkTabPos", tabOrder[15]); + obs_data_set_int(obj, "sceneGroupTabPos", tabOrder[16]); + obs_data_set_int(obj, "triggerTabPos", tabOrder[17]); + + obs_data_set_bool(obj, "saveWindowGeo", saveWindowGeo); + obs_data_set_int(obj, "windowPosX", windowPos.x()); + obs_data_set_int(obj, "windowPosY", windowPos.y()); + obs_data_set_int(obj, "windowWidth", windowSize.width()); + obs_data_set_int(obj, "windowHeight", windowSize.height()); + + saveSplitterPos(macroActionConditionSplitterPosition, obj, + "macroActionConditionSplitterPosition"); + saveSplitterPos(macroListMacroEditSplitterPosition, obj, + "macroListMacroEditSplitterPosition"); +} + +void SwitcherData::loadUISettings(obs_data_t *obj) +{ obs_data_set_default_int(obj, "generalTabPos", 0); obs_data_set_default_int(obj, "macroTabPos", 1); obs_data_set_default_int(obj, "networkTabPos", 13); @@ -739,6 +780,10 @@ void SwitcherData::loadGeneralSettings(obs_data_t *obj) (int)obs_data_get_int(obj, "windowPosY")}; windowSize = {(int)obs_data_get_int(obj, "windowWidth"), (int)obs_data_get_int(obj, "windowHeight")}; + loadSplitterPos(macroActionConditionSplitterPosition, obj, + "macroActionConditionSplitterPosition"); + loadSplitterPos(macroListMacroEditSplitterPosition, obj, + "macroListMacroEditSplitterPosition"); } bool SwitcherData::tabOrderValid() diff --git a/src/macro-core/macro-tab.cpp b/src/macro-core/macro-tab.cpp index ee2e63d7..49d2cb5b 100644 --- a/src/macro-core/macro-tab.cpp +++ b/src/macro-core/macro-tab.cpp @@ -423,6 +423,21 @@ void AdvSceneSwitcher::on_macroProperties_clicked() emit HighlightConditionsChanged(prop._highlightConditions); } +// Don't restore splitter pos if an element is not visible at all +bool shouldResotreSplitterPos(const QList &pos) +{ + if (pos.size() == 0) { + return false; + } + + for (int i = 0; i < pos.size(); ++i) { + if (pos[i] == 0) { + return false; + } + } + return true; +} + void AdvSceneSwitcher::setupMacroTab() { const QSignalBlocker signalBlocker(ui->macros); @@ -498,6 +513,19 @@ void AdvSceneSwitcher::setupMacroTab() // Reserve more space for macro edit area than for the macro list ui->macroListMacroEditSplitter->setStretchFactor(0, 1); ui->macroListMacroEditSplitter->setStretchFactor(1, 4); + + if (switcher->saveWindowGeo) { + if (shouldResotreSplitterPos( + switcher->macroActionConditionSplitterPosition)) { + ui->macroActionConditionSplitter->setSizes( + switcher->macroActionConditionSplitterPosition); + } + if (shouldResotreSplitterPos( + switcher->macroListMacroEditSplitterPosition)) { + ui->macroListMacroEditSplitter->setSizes( + switcher->macroListMacroEditSplitterPosition); + } + } } void AdvSceneSwitcher::ShowMacroContextMenu(const QPoint &pos) diff --git a/src/switcher-data-structs.hpp b/src/switcher-data-structs.hpp index f7c03d2c..bb1f9579 100644 --- a/src/switcher-data-structs.hpp +++ b/src/switcher-data-structs.hpp @@ -235,6 +235,8 @@ struct SwitcherData { bool saveWindowGeo = false; QPoint windowPos = {}; QSize windowSize = {}; + QList macroActionConditionSplitterPosition; + QList macroListMacroEditSplitterPosition; bool versionChanged(obs_data_t *obj, std::string currentVersion); @@ -307,6 +309,7 @@ struct SwitcherData { void saveNetworkSwitches(obs_data_t *obj); void saveGeneralSettings(obs_data_t *obj); void saveHotkeys(obs_data_t *obj); + void saveUISettings(obs_data_t *obj); void saveVersion(obs_data_t *obj, const std::string ¤tVersion); void loadSettings(obs_data_t *obj); @@ -330,6 +333,7 @@ struct SwitcherData { void loadNetworkSettings(obs_data_t *obj); void loadGeneralSettings(obs_data_t *obj); void loadHotkeys(obs_data_t *obj); + void loadUISettings(obs_data_t *obj); void Prune();