diff --git a/CMakeLists.txt b/CMakeLists.txt index 6fe03ed6..f5c32f26 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,6 +80,7 @@ qt_add_qml_module(chat qml/SettingsDialog.qml qml/StartupDialog.qml qml/PopupDialog.qml + qml/AboutDialog.qml qml/Theme.qml RESOURCES icons/send_message.svg diff --git a/chatlistmodel.cpp b/chatlistmodel.cpp index 5114e02d..fec9c7e4 100644 --- a/chatlistmodel.cpp +++ b/chatlistmodel.cpp @@ -22,13 +22,15 @@ void ChatListModel::saveChats() const QFileInfo settingsInfo(settings.fileName()); QString settingsPath = settingsInfo.absolutePath(); for (Chat *chat : m_chats) { - QFile file(settingsPath + "/gpt4all-" + chat->id() + ".chat"); + QString fileName = "gpt4all-" + chat->id() + ".chat"; + QFile file(settingsPath + "/" + fileName); bool success = file.open(QIODevice::WriteOnly); if (!success) { qWarning() << "ERROR: Couldn't save chat to file:" << file.fileName(); continue; } QDataStream out(&file); + qDebug() << "serializing chat" << fileName; if (!chat->serialize(out)) { qWarning() << "ERROR: Couldn't serialize chat to file:" << file.fileName(); file.remove(); @@ -63,6 +65,7 @@ void ChatListModel::restoreChats() connect(chat, &Chat::nameChanged, this, &ChatListModel::nameChanged); m_chats.append(chat); } + qDebug() << "deserializing chat" << f; file.close(); } std::sort(m_chats.begin(), m_chats.end(), [](const Chat* a, const Chat* b) { diff --git a/main.qml b/main.qml index a41730bb..8144649e 100644 --- a/main.qml +++ b/main.qml @@ -87,6 +87,11 @@ Window { anchors.centerIn: parent } + AboutDialog { + id: aboutDialog + anchors.centerIn: parent + } + Item { Accessible.role: Accessible.Window Accessible.name: title @@ -533,6 +538,9 @@ Window { onDownloadClicked: { downloadNewModels.open() } + onAboutClicked: { + aboutDialog.open() + } } Rectangle { diff --git a/qml/AboutDialog.qml b/qml/AboutDialog.qml new file mode 100644 index 00000000..35d1ee43 --- /dev/null +++ b/qml/AboutDialog.qml @@ -0,0 +1,113 @@ +import QtCore +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.Basic +import QtQuick.Layouts +import download +import network +import llm + +Dialog { + id: abpoutDialog + anchors.centerIn: parent + modal: false + opacity: 0.9 + padding: 20 + width: 1024 + height: column.height + 40 + + Theme { + id: theme + } + + Column { + id: column + spacing: 20 + Item { + width: childrenRect.width + height: childrenRect.height + Image { + id: img + anchors.top: parent.top + anchors.left: parent.left + width: 60 + height: 60 + source: "qrc:/gpt4all/icons/logo.svg" + } + Text { + anchors.left: img.right + anchors.leftMargin: 30 + anchors.verticalCenter: img.verticalCenter + text: qsTr("About GPT4All") + color: theme.textColor + } + } + + ScrollView { + clip: true + height: 200 + width: 1024 - 40 + ScrollBar.vertical.policy: ScrollBar.AlwaysOn + ScrollBar.horizontal.policy: ScrollBar.AlwaysOff + + TextArea { + id: welcome + wrapMode: Text.Wrap + width: 1024 - 40 + padding: 20 + textFormat: TextEdit.MarkdownText + text: qsTr("### Release notes\n") + + Download.releaseInfo.notes + + qsTr("### Contributors\n") + + Download.releaseInfo.contributors + color: theme.textColor + focus: false + readOnly: true + Accessible.role: Accessible.Paragraph + Accessible.name: qsTr("Release notes") + Accessible.description: qsTr("Release notes for this version") + background: Rectangle { + color: theme.backgroundLight + radius: 10 + } + } + } + + Label { + id: discordLink + width: parent.width + textFormat: Text.RichText + wrapMode: Text.WordWrap + text: qsTr("Check out our discord channel https://discord.gg/4M2QFmTt2k") + onLinkActivated: { Qt.openUrlExternally("https://discord.gg/4M2QFmTt2k") } + color: theme.textColor + linkColor: theme.linkColor + + Accessible.role: Accessible.Link + Accessible.name: qsTr("Discord link") + } + + Label { + id: nomicProps + width: parent.width + textFormat: Text.RichText + wrapMode: Text.WordWrap + text: qsTr("Thank you to Nomic AI and the community for contributing so much great data, code, ideas, and energy to the growing open source AI ecosystem!") + onLinkActivated: { Qt.openUrlExternally("https://home.nomic.ai") } + color: theme.textColor + linkColor: theme.linkColor + + Accessible.role: Accessible.Paragraph + Accessible.name: qsTr("Thank you blurb") + Accessible.description: qsTr("Contains embedded link to https://home.nomic.ai") + } + } + + background: Rectangle { + anchors.fill: parent + color: theme.backgroundDarkest + border.width: 1 + border.color: theme.dialogBorder + radius: 10 + } +} diff --git a/qml/ChatDrawer.qml b/qml/ChatDrawer.qml index 1bf37548..783d0838 100644 --- a/qml/ChatDrawer.qml +++ b/qml/ChatDrawer.qml @@ -17,6 +17,7 @@ Drawer { } signal downloadClicked + signal aboutClicked background: Rectangle { height: parent.height @@ -259,41 +260,6 @@ Drawer { } } - /*Label { - id: discordLink - textFormat: Text.RichText - anchors.left: parent.left - anchors.right: parent.right - anchors.top: conversationList.bottom - anchors.topMargin: 20 - wrapMode: Text.WordWrap - text: qsTr("Check out our discord channel https://discord.gg/4M2QFmTt2k") - onLinkActivated: { Qt.openUrlExternally("https://discord.gg/4M2QFmTt2k") } - color: theme.textColor - linkColor: theme.linkColor - - Accessible.role: Accessible.Link - Accessible.name: qsTr("Discord link") - } - - Label { - id: nomicProps - textFormat: Text.RichText - anchors.left: parent.left - anchors.right: parent.right - anchors.top: discordLink.bottom - anchors.topMargin: 20 - wrapMode: Text.WordWrap - text: qsTr("Thanks to Nomic AI and the community for contributing so much great data and energy!") - onLinkActivated: { Qt.openUrlExternally("https://home.nomic.ai") } - color: theme.textColor - linkColor: theme.linkColor - - Accessible.role: Accessible.Paragraph - Accessible.name: qsTr("Thank you blurb") - Accessible.description: qsTr("Contains embedded link to https://home.nomic.ai") - }*/ - Button { id: checkForUpdatesButton anchors.left: parent.left @@ -329,7 +295,8 @@ Drawer { id: downloadButton anchors.left: parent.left anchors.right: parent.right - anchors.bottom: parent.bottom + anchors.bottom: aboutButton.top + anchors.bottomMargin: 10 padding: 15 contentItem: Text { text: qsTr("Download new models...") @@ -353,5 +320,34 @@ Drawer { downloadClicked() } } + + Button { + id: aboutButton + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + padding: 15 + contentItem: Text { + text: qsTr("About") + horizontalAlignment: Text.AlignHCenter + color: theme.textColor + + Accessible.role: Accessible.Button + Accessible.name: text + Accessible.description: qsTr("Use this to launch a dialog to show the about page") + } + + background: Rectangle { + opacity: .5 + border.color: theme.backgroundLightest + border.width: 1 + radius: 10 + color: theme.backgroundLight + } + + onClicked: { + aboutClicked() + } + } } } \ No newline at end of file