LCOV - code coverage report
Current view: top level - src/qt - recentrequeststablemodel.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 0 120 0.0 %
Date: 2020-09-26 01:30:44 Functions: 0 21 0.0 %

          Line data    Source code
       1             : // Copyright (c) 2011-2019 The Bitcoin Core 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/recentrequeststablemodel.h>
       6             : 
       7             : #include <qt/bitcoinunits.h>
       8             : #include <qt/guiutil.h>
       9             : #include <qt/optionsmodel.h>
      10             : #include <qt/walletmodel.h>
      11             : 
      12             : #include <clientversion.h>
      13             : #include <streams.h>
      14             : 
      15             : #include <utility>
      16             : 
      17           0 : RecentRequestsTableModel::RecentRequestsTableModel(WalletModel *parent) :
      18           0 :     QAbstractTableModel(parent), walletModel(parent)
      19           0 : {
      20             :     // Load entries from wallet
      21           0 :     std::vector<std::string> vReceiveRequests;
      22           0 :     parent->loadReceiveRequests(vReceiveRequests);
      23           0 :     for (const std::string& request : vReceiveRequests)
      24           0 :         addNewRequest(request);
      25             : 
      26             :     /* These columns must match the indices in the ColumnIndex enumeration */
      27           0 :     columns << tr("Date") << tr("Label") << tr("Message") << getAmountTitle();
      28             : 
      29           0 :     connect(walletModel->getOptionsModel(), &OptionsModel::displayUnitChanged, this, &RecentRequestsTableModel::updateDisplayUnit);
      30           0 : }
      31             : 
      32           0 : RecentRequestsTableModel::~RecentRequestsTableModel()
      33           0 : {
      34             :     /* Intentionally left empty */
      35           0 : }
      36             : 
      37           0 : int RecentRequestsTableModel::rowCount(const QModelIndex &parent) const
      38             : {
      39             :     Q_UNUSED(parent);
      40             : 
      41           0 :     return list.length();
      42             : }
      43             : 
      44           0 : int RecentRequestsTableModel::columnCount(const QModelIndex &parent) const
      45             : {
      46             :     Q_UNUSED(parent);
      47             : 
      48           0 :     return columns.length();
      49             : }
      50             : 
      51           0 : QVariant RecentRequestsTableModel::data(const QModelIndex &index, int role) const
      52             : {
      53           0 :     if(!index.isValid() || index.row() >= list.length())
      54           0 :         return QVariant();
      55             : 
      56           0 :     if(role == Qt::DisplayRole || role == Qt::EditRole)
      57             :     {
      58           0 :         const RecentRequestEntry *rec = &list[index.row()];
      59           0 :         switch(index.column())
      60             :         {
      61             :         case Date:
      62           0 :             return GUIUtil::dateTimeStr(rec->date);
      63             :         case Label:
      64           0 :             if(rec->recipient.label.isEmpty() && role == Qt::DisplayRole)
      65             :             {
      66           0 :                 return tr("(no label)");
      67             :             }
      68             :             else
      69             :             {
      70           0 :                 return rec->recipient.label;
      71             :             }
      72             :         case Message:
      73           0 :             if(rec->recipient.message.isEmpty() && role == Qt::DisplayRole)
      74             :             {
      75           0 :                 return tr("(no message)");
      76             :             }
      77             :             else
      78             :             {
      79           0 :                 return rec->recipient.message;
      80             :             }
      81             :         case Amount:
      82           0 :             if (rec->recipient.amount == 0 && role == Qt::DisplayRole)
      83           0 :                 return tr("(no amount requested)");
      84           0 :             else if (role == Qt::EditRole)
      85           0 :                 return BitcoinUnits::format(walletModel->getOptionsModel()->getDisplayUnit(), rec->recipient.amount, false, BitcoinUnits::SeparatorStyle::NEVER);
      86             :             else
      87           0 :                 return BitcoinUnits::format(walletModel->getOptionsModel()->getDisplayUnit(), rec->recipient.amount);
      88             :         }
      89           0 :     }
      90           0 :     else if (role == Qt::TextAlignmentRole)
      91           0 :     {
      92           0 :         if (index.column() == Amount)
      93           0 :             return (int)(Qt::AlignRight|Qt::AlignVCenter);
      94             :     }
      95           0 :     return QVariant();
      96           0 : }
      97             : 
      98           0 : bool RecentRequestsTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
      99             : {
     100           0 :     return true;
     101             : }
     102             : 
     103           0 : QVariant RecentRequestsTableModel::headerData(int section, Qt::Orientation orientation, int role) const
     104             : {
     105           0 :     if(orientation == Qt::Horizontal)
     106             :     {
     107           0 :         if(role == Qt::DisplayRole && section < columns.size())
     108             :         {
     109           0 :             return columns[section];
     110             :         }
     111             :     }
     112           0 :     return QVariant();
     113           0 : }
     114             : 
     115             : /** Updates the column title to "Amount (DisplayUnit)" and emits headerDataChanged() signal for table headers to react. */
     116           0 : void RecentRequestsTableModel::updateAmountColumnTitle()
     117             : {
     118           0 :     columns[Amount] = getAmountTitle();
     119           0 :     Q_EMIT headerDataChanged(Qt::Horizontal,Amount,Amount);
     120           0 : }
     121             : 
     122             : /** Gets title for amount column including current display unit if optionsModel reference available. */
     123           0 : QString RecentRequestsTableModel::getAmountTitle()
     124             : {
     125           0 :     return (this->walletModel->getOptionsModel() != nullptr) ? tr("Requested") + " ("+BitcoinUnits::shortName(this->walletModel->getOptionsModel()->getDisplayUnit()) + ")" : "";
     126           0 : }
     127             : 
     128           0 : QModelIndex RecentRequestsTableModel::index(int row, int column, const QModelIndex &parent) const
     129             : {
     130             :     Q_UNUSED(parent);
     131             : 
     132           0 :     return createIndex(row, column);
     133             : }
     134             : 
     135           0 : bool RecentRequestsTableModel::removeRows(int row, int count, const QModelIndex &parent)
     136             : {
     137             :     Q_UNUSED(parent);
     138             : 
     139           0 :     if(count > 0 && row >= 0 && (row+count) <= list.size())
     140             :     {
     141           0 :         for (int i = 0; i < count; ++i)
     142             :         {
     143           0 :             const RecentRequestEntry* rec = &list[row+i];
     144           0 :             if (!walletModel->saveReceiveRequest(rec->recipient.address.toStdString(), rec->id, ""))
     145           0 :                 return false;
     146           0 :         }
     147             : 
     148           0 :         beginRemoveRows(parent, row, row + count - 1);
     149           0 :         list.erase(list.begin() + row, list.begin() + row + count);
     150           0 :         endRemoveRows();
     151           0 :         return true;
     152             :     } else {
     153           0 :         return false;
     154             :     }
     155           0 : }
     156             : 
     157           0 : Qt::ItemFlags RecentRequestsTableModel::flags(const QModelIndex &index) const
     158             : {
     159           0 :     return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
     160             : }
     161             : 
     162             : // called when adding a request from the GUI
     163           0 : void RecentRequestsTableModel::addNewRequest(const SendCoinsRecipient &recipient)
     164             : {
     165           0 :     RecentRequestEntry newEntry;
     166           0 :     newEntry.id = ++nReceiveRequestsMaxId;
     167           0 :     newEntry.date = QDateTime::currentDateTime();
     168           0 :     newEntry.recipient = recipient;
     169             : 
     170           0 :     CDataStream ss(SER_DISK, CLIENT_VERSION);
     171           0 :     ss << newEntry;
     172             : 
     173           0 :     if (!walletModel->saveReceiveRequest(recipient.address.toStdString(), newEntry.id, ss.str()))
     174           0 :         return;
     175             : 
     176           0 :     addNewRequest(newEntry);
     177           0 : }
     178             : 
     179             : // called from ctor when loading from wallet
     180           0 : void RecentRequestsTableModel::addNewRequest(const std::string &recipient)
     181             : {
     182           0 :     std::vector<char> data(recipient.begin(), recipient.end());
     183           0 :     CDataStream ss(data, SER_DISK, CLIENT_VERSION);
     184             : 
     185           0 :     RecentRequestEntry entry;
     186           0 :     ss >> entry;
     187             : 
     188           0 :     if (entry.id == 0) // should not happen
     189           0 :         return;
     190             : 
     191           0 :     if (entry.id > nReceiveRequestsMaxId)
     192           0 :         nReceiveRequestsMaxId = entry.id;
     193             : 
     194           0 :     addNewRequest(entry);
     195           0 : }
     196             : 
     197             : // actually add to table in GUI
     198           0 : void RecentRequestsTableModel::addNewRequest(RecentRequestEntry &recipient)
     199             : {
     200           0 :     beginInsertRows(QModelIndex(), 0, 0);
     201           0 :     list.prepend(recipient);
     202           0 :     endInsertRows();
     203           0 : }
     204             : 
     205           0 : void RecentRequestsTableModel::sort(int column, Qt::SortOrder order)
     206             : {
     207           0 :     std::sort(list.begin(), list.end(), RecentRequestEntryLessThan(column, order));
     208           0 :     Q_EMIT dataChanged(index(0, 0, QModelIndex()), index(list.size() - 1, NUMBER_OF_COLUMNS - 1, QModelIndex()));
     209           0 : }
     210             : 
     211           0 : void RecentRequestsTableModel::updateDisplayUnit()
     212             : {
     213           0 :     updateAmountColumnTitle();
     214           0 : }
     215             : 
     216           0 : bool RecentRequestEntryLessThan::operator()(const RecentRequestEntry& left, const RecentRequestEntry& right) const
     217             : {
     218           0 :     const RecentRequestEntry* pLeft = &left;
     219           0 :     const RecentRequestEntry* pRight = &right;
     220           0 :     if (order == Qt::DescendingOrder)
     221           0 :         std::swap(pLeft, pRight);
     222             : 
     223           0 :     switch(column)
     224             :     {
     225             :     case RecentRequestsTableModel::Date:
     226           0 :         return pLeft->date.toTime_t() < pRight->date.toTime_t();
     227             :     case RecentRequestsTableModel::Label:
     228           0 :         return pLeft->recipient.label < pRight->recipient.label;
     229             :     case RecentRequestsTableModel::Message:
     230           0 :         return pLeft->recipient.message < pRight->recipient.message;
     231             :     case RecentRequestsTableModel::Amount:
     232           0 :         return pLeft->recipient.amount < pRight->recipient.amount;
     233             :     default:
     234           0 :         return pLeft->id < pRight->id;
     235             :     }
     236           0 : }

Generated by: LCOV version 1.15