peertablesortproxy.cpp raw

   1  // Copyright (c) 2020-2022 The Limenka developers
   2  // Distributed under the MIT software license, see the accompanying
   3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
   4  
   5  #include <qt/peertablesortproxy.h>
   6  
   7  #include <qt/peertablemodel.h>
   8  #include <util/check.h>
   9  
  10  #include <QModelIndex>
  11  #include <QString>
  12  #include <QVariant>
  13  
  14  PeerTableSortProxy::PeerTableSortProxy(QObject* parent)
  15      : QSortFilterProxyModel(parent)
  16  {
  17  }
  18  
  19  bool PeerTableSortProxy::lessThan(const QModelIndex& left_index, const QModelIndex& right_index) const
  20  {
  21      const CNodeStats left_stats = Assert(sourceModel()->data(left_index, PeerTableModel::StatsRole).value<CNodeCombinedStats*>())->nodeStats;
  22      const CNodeStats right_stats = Assert(sourceModel()->data(right_index, PeerTableModel::StatsRole).value<CNodeCombinedStats*>())->nodeStats;
  23  
  24      switch (static_cast<PeerTableModel::ColumnIndex>(left_index.column())) {
  25      case PeerTableModel::NetNodeId:
  26          return left_stats.nodeid < right_stats.nodeid;
  27      case PeerTableModel::Age:
  28          return left_stats.m_connected > right_stats.m_connected;
  29      case PeerTableModel::Address:
  30          if (left_stats.m_network != right_stats.m_network) {
  31              return left_stats.m_network < right_stats.m_network;
  32          }
  33          return left_stats.m_addr_name.compare(right_stats.m_addr_name) < 0;
  34      case PeerTableModel::Direction:
  35          return left_stats.fInbound > right_stats.fInbound; // default sort Inbound, then Outbound
  36      case PeerTableModel::ConnectionType:
  37          return left_stats.m_conn_type < right_stats.m_conn_type;
  38      case PeerTableModel::Network:
  39          return left_stats.m_network < right_stats.m_network;
  40      case PeerTableModel::Ping:
  41          return left_stats.m_min_ping_time < right_stats.m_min_ping_time;
  42      case PeerTableModel::Sent:
  43          return left_stats.nSendBytes < right_stats.nSendBytes;
  44      case PeerTableModel::Received:
  45          return left_stats.nRecvBytes < right_stats.nRecvBytes;
  46      case PeerTableModel::Subversion:
  47          return left_stats.cleanSubVer.compare(right_stats.cleanSubVer) < 0;
  48      } // no default case, so the compiler can warn about missing cases
  49      assert(false);
  50  }
  51