#pragma once #include #include #include #include #include #include #include #include #include #include // TagPanel displays the data received for a single tag (e.g. [WDG]) in two // tabs: // - "Aktuell": the most recent value(s), updating in-place (a table for // key=value pairs, or a plain label for raw/free-form content). If a // value contains ';', it is treated as a LIST: the key is shown once // and each list element gets its own row below it (key cell left empty // for the continuation rows, like a merged-cell look). // Example: Devs=trackdisk.device;input.device // Devs trackdisk.device // input.device // - "Verlauf": every value ever received for this tag, timestamped, in // receive order - so you can see the full runtime history rather than // just the latest snapshot. class TagPanel : public QGroupBox { Q_OBJECT public: explicit TagPanel(const QString &tag, QWidget *parent = nullptr); const QString &tag() const { return m_tag; } public slots: void update(const QString &value); private slots: void copyToClipboard(); void clearHistory(); private: void parseKeyValue(const QString &value); void showRaw(const QString &value); // Replaces all rows belonging to `key` with one row per value in `values`. void setKeyValues(const QString &key, const QStringList &values); // Appends a timestamped entry for `value` to the "Verlauf" tab. void appendHistory(const QString &value); QString m_tag; QTabWidget *m_tabs = nullptr; QTableWidget *m_table = nullptr; QLabel *m_rawLabel = nullptr; QPlainTextEdit *m_historyEdit = nullptr; int m_historyCount = 0; // Cap history growth for very chatty/long-running tags so memory use // stays bounded; oldest entries are dropped first (FIFO). static constexpr int kMaxHistoryEntries = 5000; // Track which table rows belong to which key, so repeated updates can // replace the previous rows instead of appending duplicates. // Maps key -> (first row index, row count) struct KeyRange { int firstRow; int count; }; QMap m_keyRanges; };