From bca24a075ee71d84225deb81381caef97e94c811 Mon Sep 17 00:00:00 2001 From: fredzo Date: Tue, 22 Oct 2024 22:48:44 +0200 Subject: [PATCH] Added instrument badge latching. --- src/ngscopeclient/StreamBrowserDialog.cpp | 83 ++++++++++++++++++----- src/ngscopeclient/StreamBrowserDialog.h | 12 ++++ 2 files changed, 79 insertions(+), 16 deletions(-) diff --git a/src/ngscopeclient/StreamBrowserDialog.cpp b/src/ngscopeclient/StreamBrowserDialog.cpp index 7ca0b706..b90dbe7f 100644 --- a/src/ngscopeclient/StreamBrowserDialog.cpp +++ b/src/ngscopeclient/StreamBrowserDialog.cpp @@ -69,6 +69,9 @@ void StreamBrowserDialog::renderInfoLink(const char *label, const char *linktext hovered |= ImGui::IsItemHovered(); } +/* + @brief prepare rendering context to display a badge at the end of current line + */ void StreamBrowserDialog::startBadgeLine() { ImGuiWindow *window = ImGui::GetCurrentWindowRead(); @@ -77,6 +80,63 @@ void StreamBrowserDialog::startBadgeLine() m_badgeXCur = ImGui::GetWindowContentRegionMax().x; } +/* + @brief render a badge for an instrument node + + @param inst the instrument to render the badge for + @param latched true if the redering of this batch should be latched (i.e. only renderd it previous badge has been here for more than a given time) + @param badge the bade type +*/ +bool StreamBrowserDialog::renderInstrumentBadge(std::shared_ptr inst, bool latched, InstrumentBadge badge) +{ + auto& prefs = m_session.GetPreferences(); + double now = GetTime(); + bool result = false; + if(latched) + { + std::pair old = m_instrumentLastBadge[inst]; + double elapsed = now - old.first; + if(elapsed < 0.4) + { // Keep previous badge + badge = old.second; + } + } + else + m_instrumentLastBadge[inst] = std::pair(now,badge); + + switch (badge) + { + case StreamBrowserDialog::BADGE_ARMED: + /* prefer language "ARMED" to "RUN": + * "RUN" could mean either "waiting + * for trigger" or "currently + * capturing samples post-trigger", + * "ARMED" is unambiguous */ + result = renderBadge(ImGui::ColorConvertU32ToFloat4(prefs.GetColor("Appearance.Stream Browser.trigger_armed_badge_color")), "ARMED", "A", NULL); + break; + case StreamBrowserDialog::BADGE_STOPPED: + result = renderBadge(ImGui::ColorConvertU32ToFloat4(prefs.GetColor("Appearance.Stream Browser.trigger_stopped_badge_color")), "STOPPED", "STOP", "S", NULL); + break; + case StreamBrowserDialog::BADGE_TRIGGERED: + result = renderBadge(ImGui::ColorConvertU32ToFloat4(prefs.GetColor("Appearance.Stream Browser.trigger_triggered_badge_color")), "TRIGGERED", "TRIG'D", "T'D", "T", NULL); + break; + case StreamBrowserDialog::BADGE_BUSY: + /* prefer language "BUSY" to "WAIT": + * "WAIT" could mean "waiting for + * trigger", "BUSY" means "I am + * doing something internally and am + * not ready for some reason" */ + result = renderBadge(ImGui::ColorConvertU32ToFloat4(prefs.GetColor("Appearance.Stream Browser.trigger_busy_badge_color")), "BUSY", "B", NULL); + break; + case StreamBrowserDialog::BADGE_AUTO: + result = renderBadge(ImGui::ColorConvertU32ToFloat4(prefs.GetColor("Appearance.Stream Browser.trigger_auto_badge_color")), "AUTO", "A", NULL); + break; + default: + break; + } + return result; +} + bool StreamBrowserDialog::renderBadge(ImVec4 color, ... /* labels, ending in NULL */) { va_list ap; @@ -380,31 +440,22 @@ void StreamBrowserDialog::renderInstrumentNode(shared_ptr instrument else { Oscilloscope::TriggerMode mode = state ? state->m_lastTriggerState : Oscilloscope::TRIGGER_MODE_STOP; - switch (mode) { + switch (mode) + { case Oscilloscope::TRIGGER_MODE_RUN: - /* prefer language "ARMED" to "RUN": - * "RUN" could mean either "waiting - * for trigger" or "currently - * capturing samples post-trigger", - * "ARMED" is unambiguous */ - renderBadge(ImGui::ColorConvertU32ToFloat4(prefs.GetColor("Appearance.Stream Browser.trigger_armed_badge_color")), "ARMED", "A", NULL); + renderInstrumentBadge(instrument,false,BADGE_ARMED); break; case Oscilloscope::TRIGGER_MODE_STOP: - renderBadge(ImGui::ColorConvertU32ToFloat4(prefs.GetColor("Appearance.Stream Browser.trigger_stopped_badge_color")), "STOPPED", "STOP", "S", NULL); + renderInstrumentBadge(instrument,true,BADGE_STOPPED); break; case Oscilloscope::TRIGGER_MODE_TRIGGERED: - renderBadge(ImGui::ColorConvertU32ToFloat4(prefs.GetColor("Appearance.Stream Browser.trigger_triggered_badge_color")), "TRIGGERED", "TRIG'D", "T'D", "T", NULL); + renderInstrumentBadge(instrument,false,BADGE_TRIGGERED); break; case Oscilloscope::TRIGGER_MODE_WAIT: - /* prefer language "BUSY" to "WAIT": - * "WAIT" could mean "waiting for - * trigger", "BUSY" means "I am - * doing something internally and am - * not ready for some reason" */ - renderBadge(ImGui::ColorConvertU32ToFloat4(prefs.GetColor("Appearance.Stream Browser.trigger_busy_badge_color")), "BUSY", "B", NULL); + renderInstrumentBadge(instrument,true,BADGE_BUSY); break; case Oscilloscope::TRIGGER_MODE_AUTO: - renderBadge(ImGui::ColorConvertU32ToFloat4(prefs.GetColor("Appearance.Stream Browser.trigger_auto_badge_color")), "AUTO", "A", NULL); + renderInstrumentBadge(instrument,false,BADGE_AUTO); break; default: break; diff --git a/src/ngscopeclient/StreamBrowserDialog.h b/src/ngscopeclient/StreamBrowserDialog.h index f7748361..95eb9128 100644 --- a/src/ngscopeclient/StreamBrowserDialog.h +++ b/src/ngscopeclient/StreamBrowserDialog.h @@ -53,11 +53,21 @@ class StreamBrowserDialog : public Dialog virtual bool DoRender() override; protected: + enum InstrumentBadge + { + BADGE_ARMED, + BADGE_STOPPED, + BADGE_TRIGGERED, + BADGE_BUSY, + BADGE_AUTO + }; + void DoItemHelp(); // Rendeding of StreamBorwserDialog elements void renderInfoLink(const char *label, const char *linktext, bool &clicked, bool &hovered); void startBadgeLine(); bool renderBadge(ImVec4 color, ... /* labels, ending in NULL */); + bool renderInstrumentBadge(std::shared_ptr inst, bool latched, InstrumentBadge badge); int renderCombo(ImVec4 color,int selected, ... /* values, ending in NULL */); bool renderToggle(ImVec4 color, bool curValue); bool renderOnOffToggle(bool curValue); @@ -81,6 +91,8 @@ class StreamBrowserDialog : public Dialog float m_badgeXCur; // right edge to render the next badge against std::map, bool> m_instrumentDownloadIsSlow; + + std::map, pair> m_instrumentLastBadge; }; #endif