diff --git a/src/RemoteCommitsModel.cpp b/src/RemoteCommitsModel.cpp index 5fdb0937..a114ced2 100644 --- a/src/RemoteCommitsModel.cpp +++ b/src/RemoteCommitsModel.cpp @@ -10,7 +10,7 @@ RemoteCommitsModel::RemoteCommitsModel(QObject* parent) : QAbstractItemModel(parent) { QStringList header; - header << tr("Commit ID") << tr("Message") << tr("Date") << tr("Author"); + header << tr("Commit ID") << tr("Message") << tr("Date") << tr("Author") << tr("Size"); rootItem = new QTreeWidgetItem(header); } @@ -54,8 +54,26 @@ void RemoteCommitsModel::refresh(const std::string& json_data, const std::string QTreeWidgetItem* item = new QTreeWidgetItem(rootItem); item->setText(ColumnCommitId, QString::fromStdString(commit["id"])); item->setText(ColumnMessage, QString::fromStdString(commit["message"])); + item->setToolTip(ColumnMessage, QString::fromStdString(commit["message"])); + item->setText(ColumnDate, isoDateTimeStringToLocalDateTimeString(QString::fromStdString(commit["timestamp"]))); - item->setText(ColumnAuthor, QString::fromStdString(commit["author_name"]) + " <" + QString::fromStdString(commit["author_email"]) + ">"); + + QString authored_by = QString::fromStdString(commit["author_name"]) + " <" + QString::fromStdString(commit["author_email"]) + ">"; + QString committed_by = QString::fromStdString(commit["committer_name"]) + " <" + QString::fromStdString(commit["committer_email"]) + ">"; + item->setText(ColumnAuthor, authored_by); + if(committed_by == " <>" || authored_by == committed_by) // The first check effectively checks for no committer details + item->setToolTip(ColumnAuthor, tr("Authored and committed by %1").arg(authored_by)); + else + item->setToolTip(ColumnAuthor, tr("Authored by %1, committed by %2").arg(authored_by, committed_by)); + + for(const auto& e : commit["tree"]["entries"]) + { + if(e["entry_type"] == "db") + { + item->setText(ColumnSize, humanReadableSize(e["size"])); + break; + } + } // Make the currently checked out commit id bold if(current_commit_id == commit["id"]) @@ -118,6 +136,8 @@ QVariant RemoteCommitsModel::data(const QModelIndex& index, int role) const case Qt::DisplayRole: case Qt::EditRole: return item->text(index.column()); + case Qt::ToolTipRole: + return item->toolTip(index.column()); case Qt::FontRole: return item->font(0); // Choose font for the entire row depending on the first column default: diff --git a/src/RemoteCommitsModel.h b/src/RemoteCommitsModel.h index 02478a86..d2b540cb 100644 --- a/src/RemoteCommitsModel.h +++ b/src/RemoteCommitsModel.h @@ -33,6 +33,7 @@ public: ColumnMessage, ColumnDate, ColumnAuthor, + ColumnSize, }; private: diff --git a/src/RemoteModel.cpp b/src/RemoteModel.cpp index 36c1fa9a..19597761 100644 --- a/src/RemoteModel.cpp +++ b/src/RemoteModel.cpp @@ -81,16 +81,22 @@ std::vector RemoteModelItem::loadArray(const json& array, Remo // Create a new model item with the specified parent RemoteModelItem* item = new RemoteModelItem(parent); - // Save all relevant values. If one of the values isn't set in the JSON document, an empty string - // will be stored + // Save all relevant values. Some of the values are only available for databases. item->setValue(RemoteModelColumnName, QString::fromStdString(elem["name"])); item->setValue(RemoteModelColumnType, QString::fromStdString(elem["type"])); item->setValue(RemoteModelColumnUrl, QString::fromStdString(elem["url"])); item->setValue(RemoteModelColumnLastModified, isoDateTimeStringToLocalDateTimeString(QString::fromStdString(elem["last_modified"]))); - if(elem.contains("commit_id")) + if(item->value(RemoteModelColumnType).toString() == "database") + { item->setValue(RemoteModelColumnCommitId, QString::fromStdString(elem["commit_id"])); - if(elem.contains("size")) item->setValue(RemoteModelColumnSize, QString::number(static_cast(elem["size"]))); + item->setValue(RemoteModelColumnDefaultBranch, QString::fromStdString(elem["default_branch"])); + item->setValue(RemoteModelColumnLicence, QString::fromStdString(elem["licence"])); + item->setValue(RemoteModelColumnOneLineDescription, QString::fromStdString(elem["one_line_description"])); + item->setValue(RemoteModelColumnPublic, static_cast(elem["public"])); + item->setValue(RemoteModelColumnSha256, QString::fromStdString(elem["sha256"])); + item->setValue(RemoteModelColumnRepoModified, isoDateTimeStringToLocalDateTimeString(QString::fromStdString(elem["repo_modified"]))); + } items.push_back(item); } @@ -214,6 +220,20 @@ QVariant RemoteModel::data(const QModelIndex& index, int role) const return QImage(":/icons/folder"); else if(type == "database") return QImage(":/icons/database"); + } else if(role == Qt::ToolTipRole) { + if(type == "database") + { + // Use URL to generate user name and database name. This avoids using the name of the parent item which + // might not contain the user name when the server sends a different directory structure. + QString result = "" + item->value(RemoteModelColumnUrl).toUrl().path().mid(1) + ""; + if(!item->value(RemoteModelColumnOneLineDescription).toString().isEmpty()) + result += "
" + item->value(RemoteModelColumnOneLineDescription).toString(); + result += "
" + tr("Size: ") + humanReadableSize(item->value(RemoteModelColumnSize).toULongLong()); + result += "
" + tr("Last Modified: ") + item->value(RemoteModelColumnLastModified).toString(); + result += "
" + tr("Licence: ") + item->value(RemoteModelColumnLicence).toString(); + result += "
" + tr("Default Branch: ") + item->value(RemoteModelColumnDefaultBranch).toString(); + return result; + } } else if(role == Qt::DisplayRole) { // Display role? diff --git a/src/RemoteModel.h b/src/RemoteModel.h index 58737711..dacabeb8 100644 --- a/src/RemoteModel.h +++ b/src/RemoteModel.h @@ -15,6 +15,12 @@ enum RemoteModelColumns RemoteModelColumnCommitId, RemoteModelColumnSize, RemoteModelColumnLastModified, + RemoteModelColumnDefaultBranch, + RemoteModelColumnLicence, + RemoteModelColumnOneLineDescription, + RemoteModelColumnPublic, + RemoteModelColumnRepoModified, + RemoteModelColumnSha256, RemoteModelColumnCount };