#pragma once #include #include #include #include #include #include #include #include #include class MemberListModel; class DbManager; struct DetailAddress { int family; int protocol; QByteArray addr; int port; int socket_id; int addr_type; QString ifname; }; struct MemberLinkSnap { bool isTcp; int linkState; int linkStatus; bool tcpReady; bool isServer; int localFamily; QByteArray localAddr; uint16_t localPort; int family; QByteArray addr; uint16_t port; char sockName[20]; bool isReality; }; struct MemberSockSnap { int sockId; uint16_t port; int linksUp; int linksDown; QString ifname; }; class AccountList : public QWidget { Q_OBJECT public: explicit AccountList(DbManager* db = nullptr, QWidget *parent = nullptr); ~AccountList(); void setChannel(const QString& channelId); void refresh(); void onMemberDetailData(uint64_t nodeId, const uint8_t* data, int len); void onNodeinfoUpdate(const uint8_t* data, int len); /* Bridge callbacks (called from GUI thread) */ void onMemberList(const QString& chId, int count, const uint8_t* data, int dataLen); void onMemberUpdated(const QString& chId, const uint8_t* data); void onMemberRemoved(const QString& chId, uint64_t nodeId); MemberListModel* model() const { return m_model; } signals: void memberRenamed(); private slots: void onMemberClicked(const QModelIndex& index); void onMemberDoubleClicked(const QModelIndex& index); void onMemberContextMenu(const QPoint& pos); void onDetailTimerTick(); private: void showMemberDetail(quint64 nodeId); void updateDetailDisplay(); void requestMemberDetail(); static QString relativeTimeStr(qint64 timestamp); static QString addrStr(const void* addr, int family); QListView *m_listView; MemberListModel *m_model; DbManager *m_db; QLabel *m_header; QWidget *m_detailPanel; QLabel *m_detailHeader; QTextEdit *m_detailText; QTimer *m_detailTimer; QTimer *m_linkTimer; QString m_channelId; quint64 m_detailNodeId = 0; QString m_detailName; bool m_detailOnline = false; qint64 m_detailLastSeen = 0; qint64 m_detailCreated = 0; QVector m_detailAddrs; bool m_snapConnPresent = false; bool m_snapConnUp = false; bool m_snapConnInit = false; int m_snapOwnTcpActive = 0; uint16_t m_snapChainRtt = 0; uint8_t m_snapHopCount = 0; uint16_t m_snapBgpNodes = 0; QString m_bgpText; QVector m_snapLinks; QVector m_snapSocks; };