diff --git a/src/ui/viewmodels/TriggerConditionViewModel.cpp b/src/ui/viewmodels/TriggerConditionViewModel.cpp index aef90bea..daab686c 100644 --- a/src/ui/viewmodels/TriggerConditionViewModel.cpp +++ b/src/ui/viewmodels/TriggerConditionViewModel.cpp @@ -621,6 +621,9 @@ const rc_condition_t* TriggerConditionViewModel::GetFirstCondition() const // find the condset associated to the selected group if (nIndex == 0) { + if (!pTrigger->requirement) + return nullptr; + pFirstCondition = pTrigger->requirement->conditions; } else diff --git a/src/ui/viewmodels/TriggerViewModel.cpp b/src/ui/viewmodels/TriggerViewModel.cpp index 286ed6ce..167f7295 100644 --- a/src/ui/viewmodels/TriggerViewModel.cpp +++ b/src/ui/viewmodels/TriggerViewModel.cpp @@ -338,7 +338,7 @@ void TriggerViewModel::PasteFromClipboard() sNarrowText.insert(0, "M:"); } - const auto nResult = AppendMemRefChain(sNarrowText); + const auto nResult = AppendMemRefChain(sNarrowText, true); if (nResult != RC_OK) { if (nResult == RC_MULTIPLE_GROUPS) @@ -354,7 +354,7 @@ void TriggerViewModel::PasteFromClipboard() } } -int TriggerViewModel::AppendMemRefChain(const std::string& sTrigger) +int TriggerViewModel::AppendMemRefChain(const std::string& sTrigger, bool bSelect) { // have to use internal parsing functions to decode conditions without full trigger/value // restriction validation (full validation will occur after new conditions are added) @@ -391,14 +391,19 @@ int TriggerViewModel::AppendMemRefChain(const std::string& sTrigger) m_bInitializingConditions = true; - DeselectAllConditions(); + if (bSelect) + DeselectAllConditions(); const auto nCountBefore = GetValue(ScrollMaximumProperty); UpdateConditions(pGroup); - const auto nCountAfter = GetValue(ScrollMaximumProperty); - EnsureVisible(nCountBefore, nCountAfter - nCountBefore); - SelectRange(nCountBefore, gsl::narrow_cast(nCountAfter) - 1, true); + if (bSelect) + { + const auto nCountAfter = GetValue(ScrollMaximumProperty); + EnsureVisible(nCountBefore, nCountAfter - nCountBefore); + + SelectRange(nCountBefore, gsl::narrow_cast(nCountAfter) - 1, true); + } m_bInitializingConditions = false; @@ -706,7 +711,7 @@ void TriggerViewModel::NewCondition() } } - AppendMemRefChain(sMemRef); + AppendMemRefChain(sMemRef, true); } void TriggerViewModel::AddAltGroup(int nId, rc_condset_t* pConditionSet) @@ -815,17 +820,23 @@ void TriggerViewModel::InitializeFrom(const std::string& sTrigger) { InitializeGroups(*m_pTrigger); } - else if (m_bIsValue) - { - rc_value_t pValue; - memset(&pValue, 0, sizeof(pValue)); - InitializeFrom(pValue); - } else { - rc_trigger_t pTrigger; - memset(&pTrigger, 0, sizeof(pTrigger)); - InitializeFrom(pTrigger); + if (m_bIsValue) + { + rc_value_t pValue; + memset(&pValue, 0, sizeof(pValue)); + InitializeFrom(pValue); + } + else + { + rc_trigger_t pTrigger; + memset(&pTrigger, 0, sizeof(pTrigger)); + InitializeFrom(pTrigger); + } + + if (!sTrigger.empty()) + AppendMemRefChain(sTrigger, false); } } diff --git a/src/ui/viewmodels/TriggerViewModel.hh b/src/ui/viewmodels/TriggerViewModel.hh index 61ab945b..833b63c5 100644 --- a/src/ui/viewmodels/TriggerViewModel.hh +++ b/src/ui/viewmodels/TriggerViewModel.hh @@ -188,7 +188,7 @@ private: void UpdateConditions(const GroupViewModel* pGroup); void UpdateTotalHits(const GroupViewModel* pGroup); - int AppendMemRefChain(const std::string& sTrigger); + int AppendMemRefChain(const std::string& sTrigger, bool bSelect); void DeselectAllConditions(); rc_trigger_t* ParseTrigger(const std::string& sTrigger); diff --git a/tests/ui/viewmodels/TriggerViewModel_Tests.cpp b/tests/ui/viewmodels/TriggerViewModel_Tests.cpp index 1085581e..13285229 100644 --- a/tests/ui/viewmodels/TriggerViewModel_Tests.cpp +++ b/tests/ui/viewmodels/TriggerViewModel_Tests.cpp @@ -296,6 +296,8 @@ TEST_CLASS(TriggerViewModel_Tests) ParseAndRegenerateValue("M:0xS2345$M:0xS2346"); // bit6 in alts ParseAndRegenerateValue("A:0xH1234&31_M:0"); // bitwise and ParseAndRegenerateValue("A:0xH1234^129_M:0"); // bitwise or + + ParseAndRegenerateValue("I:0xH1234_0x 2345"); // missing measured } TEST_METHOD(TestTriggerUpdateConditionModified)