KTextAddons

bergamotenginelanguagewidget.cpp
1/*
2 SPDX-FileCopyrightText: 2023-2025 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#include "bergamotenginelanguagewidget.h"
8#include "libbergamot_debug.h"
9#include "translatormodel.h"
10#include "translatorproxymodel.h"
11#include <KLocalizedString>
12#include <KMessageBox>
13#include <QLabel>
14#include <QLineEdit>
15#include <QProgressBar>
16#include <QPushButton>
17#include <QTreeView>
18#include <QVBoxLayout>
19
20#include <KLineEditEventHandler>
21
22BergamotEngineLanguageWidget::BergamotEngineLanguageWidget(QWidget *parent)
23 : QWidget{parent}
24 , mTreeView(new QTreeView(this))
25 , mSearchLineEdit(new QLineEdit(this))
26 , mTranslatorModel(new TranslatorModel(this))
27 , mTranslatorProxyModel(new TranslatorProxyModel(this))
28 , mProgressBar(new QProgressBar(this))
29 , mProgressBarLabel(new QLabel(this))
30 , mProgressBarWidget(new QWidget(this))
31{
32 auto mainLayout = new QVBoxLayout(this);
33 mainLayout->setObjectName(QStringLiteral("mainLayout"));
34 mainLayout->setContentsMargins({});
35
36 auto hboxLayout = new QHBoxLayout;
37 hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
38 hboxLayout->setContentsMargins({});
39 mainLayout->addLayout(hboxLayout);
40
41 auto vboxLayout = new QVBoxLayout;
42 vboxLayout->setObjectName(QStringLiteral("vboxLayout"));
43 vboxLayout->setContentsMargins({});
44
45 mSearchLineEdit->setObjectName(QStringLiteral("mSearchLineEdit"));
46 vboxLayout->addWidget(mSearchLineEdit);
47 mSearchLineEdit->setPlaceholderText(i18nc("@info:placeholder", "Search…"));
48 mSearchLineEdit->setClearButtonEnabled(true);
49
51
52 mTreeView->setObjectName(QStringLiteral("mTreeView"));
53 connect(ManagerModelTranslator::self(), &ManagerModelTranslator::errorText, this, &BergamotEngineLanguageWidget::slotError);
54 connect(ManagerModelTranslator::self(), &ManagerModelTranslator::progress, this, &BergamotEngineLanguageWidget::slotProgressInfo);
55 connect(ManagerModelTranslator::self(), &ManagerModelTranslator::extractDone, mTranslatorModel, &TranslatorModel::updateInstalledLanguage);
56 connect(ManagerModelTranslator::self(), &ManagerModelTranslator::downLoadModelListDone, this, &BergamotEngineLanguageWidget::updateListModel);
57
58 // TODO store list on local.
59 if (ManagerModelTranslator::self()->needDownloadModelList()) {
60 ManagerModelTranslator::self()->downloadListModels();
61 } else {
62 mTranslatorModel->insertTranslators(ManagerModelTranslator::self()->translators());
63 }
64
65 mTranslatorProxyModel->setSortCaseSensitivity(Qt::CaseInsensitive);
66 mTranslatorProxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
67 mTranslatorProxyModel->setSourceModel(mTranslatorModel);
68 mTreeView->setModel(mTranslatorProxyModel);
69 mTreeView->setRootIsDecorated(false);
70 mTreeView->setSortingEnabled(true);
71 vboxLayout->addWidget(mTreeView);
72
73 hboxLayout->addLayout(vboxLayout);
74
75 auto buttonLayout = new QVBoxLayout;
76 buttonLayout->setObjectName(QStringLiteral("buttonLayout"));
77 hboxLayout->addLayout(buttonLayout);
78
79 auto downLoadLanguage = new QPushButton(QIcon::fromTheme(QStringLiteral("download-symbolic")), i18n("Download"), this);
80 downLoadLanguage->setObjectName(QStringLiteral("downLoadLanguage"));
81 buttonLayout->addWidget(downLoadLanguage);
82 connect(downLoadLanguage, &QPushButton::clicked, this, [this]() {
83 const auto currentlySelectedIndex = mTranslatorProxyModel->mapToSource(mTreeView->selectionModel()->currentIndex());
84 const QModelIndex modelIndex = mTranslatorModel->index(currentlySelectedIndex.row(), TranslatorModel::Url);
85 const QModelIndex modelIndexCheckSum = mTranslatorModel->index(currentlySelectedIndex.row(), TranslatorModel::CheckSum);
86
87 const QString url = modelIndex.data().toString();
88 const QString checkSum = modelIndexCheckSum.data().toString();
89 qCDebug(TRANSLATOR_LIBBERGAMOT_LOG) << " url " << url << " checksum " << checkSum;
90 slotDownLoad(url, checkSum);
91 });
92
93 auto deleteLanguage = new QPushButton(QIcon::fromTheme(QStringLiteral("edit-delete")), i18n("Delete"), this);
94 deleteLanguage->setObjectName(QStringLiteral("downLoadLanguage"));
95 buttonLayout->addWidget(deleteLanguage);
96
97 auto updateListLanguage = new QPushButton(i18nc("@action:button", "Update List"), this);
98 updateListLanguage->setToolTip(i18nc("@info:tooltip", "Update list of languages from network"));
99 updateListLanguage->setObjectName(QStringLiteral("updateListLanguage"));
100 buttonLayout->addWidget(updateListLanguage);
101 buttonLayout->addStretch(1); // spacer
102 connect(updateListLanguage, &QPushButton::clicked, this, &BergamotEngineLanguageWidget::slotUpdateListLanguage);
103
104 connect(mSearchLineEdit, &QLineEdit::textChanged, this, &BergamotEngineLanguageWidget::slotTextChanged);
105
106 auto progressBarLayout = new QHBoxLayout;
107 progressBarLayout->setObjectName(QStringLiteral("progressBarLayout"));
108
109 mProgressBarLabel->setObjectName(QStringLiteral("mProgressBarLabel"));
110 progressBarLayout->addWidget(mProgressBarLabel);
111
112 mProgressBar->setObjectName(QStringLiteral("mProgressBar"));
113 progressBarLayout->addWidget(mProgressBar);
114
115 mProgressBarWidget->setObjectName(QStringLiteral("mProgressBarWidget"));
116 mProgressBarWidget->setLayout(progressBarLayout);
117
118 mainLayout->addWidget(mProgressBarWidget);
119 mProgressBarWidget->setVisible(false);
120
121 mTreeView->setColumnHidden(TranslatorModel::Url, true);
122 mTreeView->setColumnHidden(TranslatorModel::CheckSum, true);
123 mTreeView->setColumnHidden(TranslatorModel::Identifier, true);
124 mTreeView->setColumnHidden(TranslatorModel::NeedToUpdateLanguage, true);
125 auto updateButton = [this, downLoadLanguage, deleteLanguage]() {
126 const bool hasSelectedItem = mTreeView->currentIndex().isValid();
127 const auto currentlySelectedIndex = mTranslatorProxyModel->mapToSource(mTreeView->selectionModel()->currentIndex());
128 const QModelIndex modelIndex = mTranslatorModel->index(currentlySelectedIndex.row(), TranslatorModel::Installed);
129 const QModelIndex modelIndexNeedToUpdate = mTranslatorModel->index(currentlySelectedIndex.row(), TranslatorModel::NeedToUpdateLanguage);
130 const bool isInstalled = modelIndex.data().toBool();
131 const bool needToUpdate = modelIndexNeedToUpdate.data().toBool();
132
133 if (needToUpdate) {
134 downLoadLanguage->setEnabled(hasSelectedItem && needToUpdate);
135 } else {
136 downLoadLanguage->setEnabled(hasSelectedItem && !isInstalled);
137 }
138 deleteLanguage->setEnabled(hasSelectedItem && isInstalled);
139 };
140
141 connect(deleteLanguage, &QPushButton::clicked, this, [this, updateButton]() {
142 const auto currentlySelectedIndex = mTranslatorProxyModel->mapToSource(mTreeView->selectionModel()->currentIndex());
143 const QModelIndex modelIndex = mTranslatorModel->index(currentlySelectedIndex.row(), TranslatorModel::Identifier);
144 const QString identifier = modelIndex.data().toString();
145 slotDelete(identifier);
146 updateButton();
147 });
148
149 connect(mTreeView->selectionModel(), &QItemSelectionModel::selectionChanged, this, [updateButton]() {
150 updateButton();
151 });
152 downLoadLanguage->setEnabled(false);
153 deleteLanguage->setEnabled(false);
154}
155
156BergamotEngineLanguageWidget::~BergamotEngineLanguageWidget() = default;
157
158void BergamotEngineLanguageWidget::slotProgressInfo(const ManagerModelTranslator::ProgressInfo &info)
159{
160 if (info.bytesReceived != info.bytesTotal) {
161 mProgressBarWidget->setVisible(true);
162 } else {
163 mProgressBarWidget->setVisible(false);
164 }
165 mProgressBarLabel->setText(info.languageName);
166 mProgressBar->setRange(0, 100);
167 mProgressBar->setValue((info.bytesReceived * 100) / info.bytesTotal);
168}
169
170void BergamotEngineLanguageWidget::slotError(const QString &str)
171{
172 KMessageBox::error(this, i18n("Error: %1", str), i18n("Bergamot"));
173}
174
175void BergamotEngineLanguageWidget::slotTextChanged(const QString &str)
176{
177 mTranslatorProxyModel->setSearchString(str);
178}
179
180void BergamotEngineLanguageWidget::slotDownLoad(const QString &url, const QString &checkSum)
181{
182 ManagerModelTranslator::self()->downloadLanguage(url, checkSum);
183}
184
185void BergamotEngineLanguageWidget::slotDelete(const QString &identifier)
186{
187 mTranslatorModel->removeLanguage(identifier);
188}
189
190void BergamotEngineLanguageWidget::slotUpdateListLanguage()
191{
192 ManagerModelTranslator::self()->downloadListModels();
193}
194
195void BergamotEngineLanguageWidget::updateListModel()
196{
197 mTranslatorModel->insertTranslators(ManagerModelTranslator::self()->translators());
198}
199
200#include "moc_bergamotenginelanguagewidget.cpp"
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
void catchReturnKey(QObject *lineEdit)
void error(QWidget *parent, const QString &text, const QString &title, const KGuiItem &buttonOk, Options options=Notify)
void clicked(bool checked)
QIcon fromTheme(const QString &name)
void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
void textChanged(const QString &text)
QVariant data(int role) const const
void setObjectName(QAnyStringView name)
CaseInsensitive
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
bool toBool() const const
QString toString() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Apr 25 2025 12:06:14 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.