From ad6e72091278bc195488644af17726cc8c8488be Mon Sep 17 00:00:00 2001 From: Przemek Pawlas <3606072+Destroy666x@users.noreply.github.com> Date: Sat, 2 Mar 2024 15:12:29 +0100 Subject: [PATCH] Add last changed column to variable tab --- data/locale/en-US.ini | 3 +++ lib/variables/variable-tab.cpp | 45 ++++++++++++++++++++++++++++------ lib/variables/variable.cpp | 37 ++++++++++++++++++++++------ lib/variables/variable.hpp | 5 ++++ 4 files changed, 76 insertions(+), 14 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index dc5773ff..ac74dfab 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -78,8 +78,11 @@ AdvSceneSwitcher.variableTab.header.name="Name" AdvSceneSwitcher.variableTab.header.value="Value" AdvSceneSwitcher.variableTab.header.saveLoadBehavior="Save/Load behavior" AdvSceneSwitcher.variableTab.header.lastUse="Last used" +AdvSceneSwitcher.variableTab.header.lastChanged="Last changed" AdvSceneSwitcher.variableTab.neverNused="Never" AdvSceneSwitcher.variableTab.lastUsed="%1 seconds ago" +AdvSceneSwitcher.variableTab.lastChanged="%1 seconds ago" +AdvSceneSwitcher.variableTab.lastChanged.tooltip="Previous value: %1" ; Macro Tab AdvSceneSwitcher.macroTab.title="Macro" diff --git a/lib/variables/variable-tab.cpp b/lib/variables/variable-tab.cpp index 3abd5f0d..51571fd8 100644 --- a/lib/variables/variable-tab.cpp +++ b/lib/variables/variable-tab.cpp @@ -60,6 +60,31 @@ static QString getLastUsedString(Variable *variable) return fmt.arg(QString::number(*lastUsed)); } +static QString formatLastChangedText(Variable *variable) +{ + auto lastChanged = variable->GetSecondsSinceLastChange(); + if (!lastChanged) { + return obs_module_text( + "AdvSceneSwitcher.variableTab.lastChanged.text.never"); + } + + QString text = + obs_module_text("AdvSceneSwitcher.variableTab.lastChanged"); + return text.arg(QString::number(*lastChanged)); +} + +static QString formatLastChangedTooltip(Variable *variable) +{ + auto lastChanged = variable->GetSecondsSinceLastChange(); + if (!lastChanged) { + return QString(); + } + + QString tooltip = obs_module_text( + "AdvSceneSwitcher.variableTab.lastChanged.tooltip"); + return tooltip.arg(QString::fromStdString(variable->PreviousValue())); +} + static void addVariableRow(QTableWidget *table, Variable *variable) { if (!variable) { @@ -75,16 +100,17 @@ static void addVariableRow(QTableWidget *table, Variable *variable) auto *item = new QTableWidgetItem(QString::fromStdString(variable->Name())); table->setItem(row, col, item); - col++; item = new QTableWidgetItem( QString::fromStdString(variable->Value(false))); - table->setItem(row, col, item); - col++; + table->setItem(row, ++col, item); item = new QTableWidgetItem(getSaveActionString(variable)); - table->setItem(row, col, item); - col++; + table->setItem(row, ++col, item); item = new QTableWidgetItem(getLastUsedString(variable)); - table->setItem(row, col, item); + table->setItem(row, ++col, item); + item = new QTableWidgetItem(formatLastChangedText(variable)); + item->setToolTip(formatLastChangedTooltip(variable)); + table->setItem(row, ++col, item); + table->sortByColumn(0, Qt::AscendingOrder); } @@ -118,6 +144,9 @@ static void updateVaribleStatus(QTableWidget *table) item->setText(getSaveActionString(variable.get())); item = table->item(row, 3); item->setText(getLastUsedString(variable.get())); + item = table->item(row, 4); + item->setText(formatLastChangedText(variable.get())); + item->setToolTip(formatLastChangedTooltip(variable.get())); } } @@ -177,7 +206,9 @@ void AdvSceneSwitcher::SetupVariableTab() << obs_module_text( "AdvSceneSwitcher.variableTab.header.saveLoadBehavior") << obs_module_text( - "AdvSceneSwitcher.variableTab.header.lastUse"); + "AdvSceneSwitcher.variableTab.header.lastUse") + << obs_module_text( + "AdvSceneSwitcher.variableTab.header.lastChanged"); auto &variables = GetVariables(); diff --git a/lib/variables/variable.cpp b/lib/variables/variable.cpp index 638a8990..7c73f7d5 100644 --- a/lib/variables/variable.cpp +++ b/lib/variables/variable.cpp @@ -35,9 +35,9 @@ void Variable::Load(obs_data_t *obj) static_cast(obs_data_get_int(obj, "saveAction")); _defaultValue = obs_data_get_string(obj, "defaultValue"); if (_saveAction == SaveAction::SAVE) { - _value = obs_data_get_string(obj, "value"); + SetValue(obs_data_get_string(obj, "value")); } else if (_saveAction == SaveAction::SET_DEFAULT) { - _value = _defaultValue; + SetValue(_defaultValue); } lastVariableChange = std::chrono::high_resolution_clock::now(); } @@ -70,20 +70,24 @@ std::optional Variable::IntValue() const return GetInt(Value()); } +std::string Variable::PreviousValue() const +{ + return _previousValue; +} + void Variable::SetValue(const std::string &value) { + _previousValue = _value; _value = value; UpdateLastUsed(); + UpdateLastChanged(); lastVariableChange = std::chrono::high_resolution_clock::now(); } void Variable::SetValue(double value) { - _value = ToString(value); - - UpdateLastUsed(); - lastVariableChange = std::chrono::high_resolution_clock::now(); + SetValue(ToString(value)); } std::optional Variable::SecondsSinceLastUse() const @@ -96,11 +100,30 @@ std::optional Variable::SecondsSinceLastUse() const .count(); } +std::optional Variable::GetSecondsSinceLastChange() const +{ + if (_lastChanged.time_since_epoch().count() == 0) { + return {}; + } + + const auto now = std::chrono::high_resolution_clock::now(); + return std::chrono::duration_cast(now - + _lastChanged) + .count(); +} + void Variable::UpdateLastUsed() const { _lastUsed = std::chrono::high_resolution_clock::now(); } +void Variable::UpdateLastChanged() const +{ + if (_previousValue != _value) { + _lastChanged = std::chrono::high_resolution_clock::now(); + } +} + std::deque> &GetVariables() { return variables; @@ -284,7 +307,7 @@ bool VariableSettingsDialog::AskForSettings(QWidget *parent, Variable &settings) } settings._name = dialog._name->text().toStdString(); - settings._value = dialog._value->toPlainText().toStdString(); + settings.SetValue(dialog._value->toPlainText().toStdString()); settings._defaultValue = dialog._defaultValue->toPlainText().toStdString(); settings._saveAction = diff --git a/lib/variables/variable.hpp b/lib/variables/variable.hpp index a0743bf6..12df5058 100644 --- a/lib/variables/variable.hpp +++ b/lib/variables/variable.hpp @@ -22,6 +22,7 @@ public: EXPORT std::string Value(bool updateLastUsed = true) const; EXPORT std::optional DoubleValue() const; EXPORT std::optional IntValue() const; + EXPORT std::string PreviousValue() const; void SetValue(const std::string &value); void SetValue(double value); std::string GetDefaultValue() const { return _defaultValue; } @@ -37,13 +38,17 @@ public: }; SaveAction GetSaveAction() const { return _saveAction; } std::optional SecondsSinceLastUse() const; + std::optional GetSecondsSinceLastChange() const; void UpdateLastUsed() const; + void UpdateLastChanged() const; private: SaveAction _saveAction = SaveAction::DONT_SAVE; std::string _value = ""; + std::string _previousValue = ""; std::string _defaultValue = ""; mutable std::chrono::high_resolution_clock::time_point _lastUsed; + mutable std::chrono::high_resolution_clock::time_point _lastChanged; friend VariableSelection; friend VariableSettingsDialog;