From b00da454e44e0fda105bf05f896663f8477972a4 Mon Sep 17 00:00:00 2001 From: Adam Treat Date: Thu, 27 Apr 2023 14:52:40 -0400 Subject: [PATCH] Provide a description and make the downloader cleaner and prettier. --- download.cpp | 37 ++++++++++++++++------ download.h | 6 ++++ qml/ModelDownloaderDialog.qml | 59 +++++++++++++++++++++-------------- 3 files changed, 70 insertions(+), 32 deletions(-) diff --git a/download.cpp b/download.cpp index 82229221..0caf118d 100644 --- a/download.cpp +++ b/download.cpp @@ -33,19 +33,35 @@ Download::Download() m_downloadLocalModelsPath = defaultLocalModelsPath(); } +bool operator==(const ModelInfo& lhs, const ModelInfo& rhs) { + return lhs.filename == rhs.filename && lhs.md5sum == rhs.md5sum; +} + QList Download::modelList() const { // We make sure the default model is listed first QList values = m_modelMap.values(); + ModelInfo defaultInfo; + ModelInfo bestGPTJInfo; + ModelInfo bestLlamaInfo; for (ModelInfo v : values) { - if (v.isDefault) { + if (v.isDefault) defaultInfo = v; - break; - } + if (v.bestGPTJ) + bestGPTJInfo = v; + if (v.bestLlama) + bestLlamaInfo = v; } - values.removeAll(defaultInfo); - values.prepend(defaultInfo); + + Q_ASSERT(defaultInfo == bestGPTJInfo || defaultInfo == bestLlamaInfo); + + values.removeAll(bestLlamaInfo); + values.prepend(bestLlamaInfo); + + values.removeAll(bestGPTJInfo); + values.prepend(bestGPTJInfo); + return values; } @@ -210,6 +226,10 @@ void Download::parseJsonFile(const QByteArray &jsonData) QString modelFilesize = obj["filesize"].toString(); QByteArray modelMd5sum = obj["md5sum"].toString().toLatin1().constData(); bool isDefault = obj.contains("isDefault") && obj["isDefault"] == QString("true"); + bool bestGPTJ = obj.contains("bestGPTJ") && obj["bestGPTJ"] == QString("true"); + bool bestLlama = obj.contains("bestLlama") && obj["bestLlama"] == QString("true"); + QString description = obj["description"].toString(); + if (isDefault) defaultModel = modelFilename; quint64 sz = modelFilesize.toULongLong(); @@ -231,6 +251,9 @@ void Download::parseJsonFile(const QByteArray &jsonData) modelInfo.md5sum = modelMd5sum; modelInfo.installed = info.exists(); modelInfo.isDefault = isDefault; + modelInfo.bestGPTJ = bestGPTJ; + modelInfo.bestLlama = bestLlama; + modelInfo.description = description; m_modelMap.insert(modelInfo.filename, modelInfo); } @@ -257,10 +280,6 @@ void Download::handleDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) emit downloadProgress(bytesReceived, bytesTotal, modelFilename); } -bool operator==(const ModelInfo& lhs, const ModelInfo& rhs) { - return lhs.filename == rhs.filename && lhs.md5sum == rhs.md5sum; -} - HashAndSaveFile::HashAndSaveFile() : QObject(nullptr) { diff --git a/download.h b/download.h index 26a5e37c..cf010609 100644 --- a/download.h +++ b/download.h @@ -17,6 +17,9 @@ struct ModelInfo { Q_PROPERTY(bool calcHash MEMBER calcHash) Q_PROPERTY(bool installed MEMBER installed) Q_PROPERTY(bool isDefault MEMBER isDefault) + Q_PROPERTY(bool bestGPTJ MEMBER bestGPTJ) + Q_PROPERTY(bool bestLlama MEMBER bestLlama) + Q_PROPERTY(QString description MEMBER description) public: QString filename; @@ -25,6 +28,9 @@ public: bool calcHash = false; bool installed = false; bool isDefault = false; + bool bestGPTJ = false; + bool bestLlama = false; + QString description; }; Q_DECLARE_METATYPE(ModelInfo) diff --git a/qml/ModelDownloaderDialog.qml b/qml/ModelDownloaderDialog.qml index 16efda3d..414724f3 100644 --- a/qml/ModelDownloaderDialog.qml +++ b/qml/ModelDownloaderDialog.qml @@ -8,7 +8,7 @@ import llm Dialog { id: modelDownloaderDialog width: 1024 - height: 435 + height: 600 modal: true opacity: 0.9 closePolicy: LLM.modelList.length === 0 ? Popup.NoAutoClose : (Popup.CloseOnEscape | Popup.CloseOnPressOutside) @@ -54,7 +54,8 @@ Dialog { delegate: Item { id: delegateItem width: modelList.width - height: 70 + height: modelName.height + modelName.padding + + description.height + description.padding objectName: "delegateItem" property bool downloading: false Rectangle { @@ -67,22 +68,37 @@ Dialog { objectName: "modelName" property string filename: modelData.filename text: filename.slice(5, filename.length - 4) - anchors.verticalCenter: parent.verticalCenter + padding: 20 + anchors.top: parent.top anchors.left: parent.left - anchors.leftMargin: 10 - color: theme.textColor + font.bold: modelData.isDefault || modelData.bestGPTJ || modelData.bestLlama + color: theme.assistantColor Accessible.role: Accessible.Paragraph Accessible.name: qsTr("Model file") Accessible.description: qsTr("Model file to be downloaded") } + Text { + id: description + text: " - " + modelData.description + leftPadding: 20 + anchors.top: modelName.bottom + anchors.left: modelName.left + anchors.right: parent.right + wrapMode: Text.WordWrap + color: theme.textColor + Accessible.role: Accessible.Paragraph + Accessible.name: qsTr("Description") + Accessible.description: qsTr("The description of the file") + } + Text { id: isDefault text: qsTr("(default)") visible: modelData.isDefault - anchors.verticalCenter: parent.verticalCenter + anchors.top: modelName.top anchors.left: modelName.right - anchors.leftMargin: 10 + padding: 20 color: theme.textColor Accessible.role: Accessible.Paragraph Accessible.name: qsTr("Default file") @@ -91,9 +107,9 @@ Dialog { Text { text: modelData.filesize - anchors.verticalCenter: parent.verticalCenter + anchors.top: modelName.top anchors.left: isDefault.visible ? isDefault.right : modelName.right - anchors.leftMargin: 10 + padding: 20 color: theme.textColor Accessible.role: Accessible.Paragraph Accessible.name: qsTr("File size") @@ -102,9 +118,9 @@ Dialog { Label { id: speedLabel - anchors.verticalCenter: parent.verticalCenter + anchors.top: modelName.top anchors.right: itemProgressBar.left - anchors.rightMargin: 10 + padding: 20 objectName: "speedLabel" color: theme.textColor text: "" @@ -117,9 +133,9 @@ Dialog { ProgressBar { id: itemProgressBar objectName: "itemProgressBar" - anchors.verticalCenter: parent.verticalCenter + anchors.top: modelName.top anchors.right: downloadButton.left - anchors.rightMargin: 10 + padding: 20 width: 100 visible: downloading background: Rectangle { @@ -147,15 +163,13 @@ Dialog { Item { visible: modelData.calcHash - anchors.verticalCenter: parent.verticalCenter + anchors.top: modelName.top anchors.right: parent.right - anchors.rightMargin: 10 Label { id: calcHashLabel anchors.right: busyCalcHash.left - anchors.rightMargin: 10 - anchors.verticalCenter: parent.verticalCenter + padding: 20 objectName: "calcHashLabel" color: theme.textColor text: qsTr("Calculating MD5...") @@ -167,7 +181,7 @@ Dialog { BusyIndicator { id: busyCalcHash anchors.right: parent.right - anchors.verticalCenter: calcHashLabel.verticalCenter + padding: 20 running: modelData.calcHash Accessible.role: Accessible.Animation Accessible.name: qsTr("Busy indicator") @@ -177,9 +191,9 @@ Dialog { Label { id: installedLabel - anchors.verticalCenter: parent.verticalCenter + anchors.top: modelName.top anchors.right: parent.right - anchors.rightMargin: 15 + padding: 20 objectName: "installedLabel" color: theme.textColor text: qsTr("Already installed") @@ -195,11 +209,10 @@ Dialog { color: theme.textColor text: downloading ? "Cancel" : "Download" } - anchors.verticalCenter: parent.verticalCenter + anchors.top: modelName.top anchors.right: parent.right - anchors.rightMargin: 10 + padding: 20 visible: !modelData.installed && !modelData.calcHash - padding: 10 onClicked: { if (!downloading) { downloading = true;