File indexing completed on 2024-05-12 05:22:10
0001 /* 0002 SPDX-FileCopyrightText: 2019 David Barchiesi <david@barchie.si> 0003 0004 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0005 */ 0006 0007 #include "mainwindow.h" 0008 0009 #include "core/account.h" 0010 #include "core/authjob.h" 0011 #include "drive/file.h" 0012 #include "drive/filefetchjob.h" 0013 #include "drive/filesearchquery.h" 0014 #include "drive/teamdrive.h" 0015 #include "drive/teamdrivecreatejob.h" 0016 #include "drive/teamdrivedeletejob.h" 0017 #include "drive/teamdrivefetchjob.h" 0018 #include "drive/teamdrivemodifyjob.h" 0019 #include "drive/teamdrivesearchquery.h" 0020 0021 #include <QListWidgetItem> 0022 #include <QUuid> 0023 0024 MainWindow::MainWindow(QWidget *parent) 0025 : QMainWindow(parent) 0026 { 0027 /* Initialize GUI */ 0028 ui.setupUi(this); 0029 ui.errorLabel->setVisible(false); 0030 connect(ui.authButton, &QAbstractButton::clicked, this, &MainWindow::authenticate); 0031 connect(ui.newTeamdriveButton, &QAbstractButton::clicked, this, &MainWindow::createTeamdrive); 0032 connect(ui.teamdriveListButton, &QAbstractButton::clicked, this, &MainWindow::fetchTeamdriveList); 0033 connect(ui.teamdriveSelectedDeleteButton, &QAbstractButton::clicked, this, &MainWindow::deleteSelectedTeamdrive); 0034 connect(ui.renameTeamdriveButton, &QAbstractButton::clicked, this, &MainWindow::renameSelectedTeamdrive); 0035 connect(ui.teamdriveList, &QListWidget::itemSelectionChanged, this, &MainWindow::teamdriveSelected); 0036 connect(ui.teamdrivePreviewList, &QListWidget::itemSelectionChanged, this, &MainWindow::teamdriveItemSelected); 0037 } 0038 0039 void MainWindow::authenticate() 0040 { 0041 auto account = KGAPI2::AccountPtr::create(); 0042 account->setScopes({KGAPI2::Account::driveScopeUrl()}); 0043 0044 /* Create AuthJob to retrieve OAuth tokens for the account */ 0045 auto *authJob = new KGAPI2::AuthJob(account, QStringLiteral("554041944266.apps.googleusercontent.com"), QStringLiteral("mdT1DjzohxN3npUUzkENT0gO")); 0046 connect(authJob, &KGAPI2::Job::finished, this, [this, authJob]() { 0047 /* Always remember to delete the jobs, otherwise your application will 0048 * leak memory. */ 0049 authJob->deleteLater(); 0050 0051 if (authJob->error() != KGAPI2::NoError) { 0052 ui.errorLabel->setText(QStringLiteral("Error: %1").arg(authJob->errorString())); 0053 ui.errorLabel->setVisible(true); 0054 return; 0055 } 0056 0057 m_account = authJob->account(); 0058 0059 ui.authStatusLabel->setText(QStringLiteral("Authenticated")); 0060 ui.teamdriveListButton->setEnabled(true); 0061 ui.newTeamdriveEdit->setEnabled(true); 0062 ui.newTeamdriveButton->setEnabled(true); 0063 ui.authButton->setEnabled(false); 0064 }); 0065 } 0066 0067 void MainWindow::createTeamdrive() 0068 { 0069 const auto teamdriveName = ui.newTeamdriveEdit->text(); 0070 if (teamdriveName.isEmpty()) { 0071 return; 0072 } 0073 const auto requestId = QUuid::createUuid().toString(); 0074 0075 auto teamdrive = KGAPI2::Drive::TeamdrivePtr::create(); 0076 teamdrive->setName(teamdriveName); 0077 0078 auto *createJob = new KGAPI2::Drive::TeamdriveCreateJob(requestId, teamdrive, m_account, this); 0079 connect(createJob, &KGAPI2::Job::finished, this, [this, createJob]() { 0080 createJob->deleteLater(); 0081 0082 if (createJob->error() != KGAPI2::NoError) { 0083 ui.errorLabel->setText(QStringLiteral("Error: %1").arg(createJob->errorString())); 0084 ui.errorLabel->setVisible(true); 0085 ui.teamdriveListButton->setEnabled(true); 0086 return; 0087 } 0088 0089 ui.newTeamdriveEdit->clear(); 0090 fetchTeamdriveList(); 0091 }); 0092 } 0093 0094 void MainWindow::renameSelectedTeamdrive() 0095 { 0096 const auto teamdriveName = ui.renameTeamdriveEdit->text(); 0097 if (teamdriveName.isEmpty()) { 0098 return; 0099 } 0100 const auto teamdriveId = ui.teamdriveList->selectedItems().at(0)->data(Qt::UserRole).toString(); 0101 0102 auto teamdrive = KGAPI2::Drive::TeamdrivePtr::create(); 0103 teamdrive->setId(teamdriveId); 0104 teamdrive->setName(teamdriveName); 0105 0106 auto *modifyJob = new KGAPI2::Drive::TeamdriveModifyJob(teamdrive, m_account, this); 0107 connect(modifyJob, &KGAPI2::Job::finished, this, [this, modifyJob]() { 0108 modifyJob->deleteLater(); 0109 0110 if (modifyJob->error() != KGAPI2::NoError) { 0111 ui.errorLabel->setText(QStringLiteral("Error: %1").arg(modifyJob->errorString())); 0112 ui.errorLabel->setVisible(true); 0113 ui.teamdriveListButton->setEnabled(true); 0114 return; 0115 } 0116 0117 fetchTeamdriveList(); 0118 }); 0119 } 0120 0121 void MainWindow::fetchTeamdriveList() 0122 { 0123 if (m_account.isNull()) { 0124 ui.errorLabel->setText(QStringLiteral("Error: Please authenticate first")); 0125 ui.errorLabel->setVisible(true); 0126 ui.authButton->setVisible(true); 0127 return; 0128 } 0129 0130 auto *fetchJob = new KGAPI2::Drive::TeamdriveFetchJob(m_account, this); 0131 connect(fetchJob, &KGAPI2::Job::finished, this, [this, fetchJob]() { 0132 fetchJob->deleteLater(); 0133 0134 if (fetchJob->error() != KGAPI2::NoError) { 0135 ui.errorLabel->setText(QStringLiteral("Error: %1").arg(fetchJob->errorString())); 0136 ui.errorLabel->setVisible(true); 0137 ui.teamdriveListButton->setEnabled(true); 0138 return; 0139 } 0140 0141 /* Get all items the job has retrieved */ 0142 const auto objects = fetchJob->items(); 0143 ui.teamdriveList->clear(); 0144 for (const auto &object : objects) { 0145 const auto teamdrive = object.dynamicCast<KGAPI2::Drive::Teamdrive>(); 0146 0147 /* Convert the teamdrive to QListWidget item */ 0148 auto *item = new QListWidgetItem(ui.teamdriveList); 0149 item->setText(teamdrive->name()); 0150 item->setData(Qt::UserRole, teamdrive->id()); 0151 0152 ui.teamdriveList->addItem(item); 0153 } 0154 0155 ui.teamdriveListButton->setEnabled(true); 0156 }); 0157 0158 ui.teamdriveListButton->setEnabled(false); 0159 } 0160 0161 void MainWindow::deleteSelectedTeamdrive() 0162 { 0163 const auto teamdrive_id = ui.teamdriveList->selectedItems().at(0)->data(Qt::UserRole).toString(); 0164 0165 auto *deleteJob = new KGAPI2::Drive::TeamdriveDeleteJob(teamdrive_id, m_account, this); 0166 connect(deleteJob, &KGAPI2::Job::finished, this, [this, deleteJob]() { 0167 deleteJob->deleteLater(); 0168 0169 if (deleteJob->error() != KGAPI2::NoError) { 0170 ui.errorLabel->setText(QStringLiteral("Error: %1").arg(deleteJob->errorString())); 0171 ui.errorLabel->setVisible(true); 0172 ui.teamdriveListButton->setEnabled(true); 0173 return; 0174 } 0175 0176 fetchTeamdriveList(); 0177 }); 0178 } 0179 0180 void MainWindow::teamdriveSelected() 0181 { 0182 const bool hasSelection = (ui.teamdriveList->selectedItems().count() != 0); 0183 0184 ui.teamdriveSelectedDeleteButton->setEnabled(hasSelection); 0185 ui.renameTeamdriveButton->setEnabled(hasSelection); 0186 ui.renameTeamdriveEdit->setEnabled(hasSelection); 0187 0188 ui.teamdrivePreviewList->clear(); 0189 0190 if (!hasSelection) { 0191 ui.renameTeamdriveEdit->clear(); 0192 return; 0193 } 0194 0195 const auto id = ui.teamdriveList->selectedItems().at(0)->data(Qt::UserRole).toString(); 0196 const auto name = ui.teamdriveList->selectedItems().at(0)->data(Qt::DisplayRole).toString(); 0197 0198 ui.renameTeamdriveEdit->setText(name); 0199 0200 KGAPI2::Drive::FileSearchQuery query; 0201 query.addQuery(KGAPI2::Drive::FileSearchQuery::Trashed, KGAPI2::Drive::FileSearchQuery::Equals, false); 0202 query.addQuery(KGAPI2::Drive::FileSearchQuery::Parents, KGAPI2::Drive::FileSearchQuery::In, id); 0203 0204 auto *fileFetchJob = new KGAPI2::Drive::FileFetchJob(query, m_account, nullptr); 0205 fileFetchJob->setFields({ 0206 KGAPI2::Drive::File::Fields::Id, 0207 KGAPI2::Drive::File::Fields::Title, 0208 }); 0209 connect(fileFetchJob, &KGAPI2::Job::finished, this, [this, fileFetchJob]() { 0210 fileFetchJob->deleteLater(); 0211 0212 if (fileFetchJob->error() != KGAPI2::NoError) { 0213 ui.errorLabel->setText(QStringLiteral("Error: %1").arg(fileFetchJob->errorString())); 0214 ui.errorLabel->setVisible(true); 0215 ui.teamdriveListButton->setEnabled(true); 0216 return; 0217 } 0218 0219 /* Get all items we have received from Google */ 0220 const auto objects = fileFetchJob->items(); 0221 0222 for (const auto &object : objects) { 0223 const auto file = object.dynamicCast<KGAPI2::Drive::File>(); 0224 0225 /* Convert the teamdrive to QListWidget item */ 0226 auto *item = new QListWidgetItem(ui.teamdrivePreviewList); 0227 item->setText(file->title()); 0228 item->setData(Qt::UserRole, file->id()); 0229 0230 ui.teamdrivePreviewList->addItem(item); 0231 } 0232 }); 0233 } 0234 0235 void MainWindow::teamdriveItemSelected() 0236 { 0237 const bool hasSelection = (ui.teamdrivePreviewList->selectedItems().count() != 0); 0238 if (!hasSelection) { 0239 return; 0240 } 0241 0242 const auto id = ui.teamdrivePreviewList->selectedItems().at(0)->data(Qt::UserRole).toString(); 0243 0244 auto *fileFetchJob = new KGAPI2::Drive::FileFetchJob(id, m_account, nullptr); 0245 fileFetchJob->setFields({ 0246 KGAPI2::Drive::File::Fields::Title, 0247 KGAPI2::Drive::File::Fields::FileSize, 0248 }); 0249 connect(fileFetchJob, &KGAPI2::Job::finished, this, [this, fileFetchJob]() { 0250 fileFetchJob->deleteLater(); 0251 0252 if (fileFetchJob->error() != KGAPI2::NoError) { 0253 ui.errorLabel->setText(QStringLiteral("Error: %1").arg(fileFetchJob->errorString())); 0254 ui.errorLabel->setVisible(true); 0255 return; 0256 } 0257 0258 const auto objects = fileFetchJob->items(); 0259 if (objects.size() != 1) { 0260 return; 0261 } 0262 0263 const auto object = objects.at(0); 0264 const auto file = object.dynamicCast<KGAPI2::Drive::File>(); 0265 QStringList msgBuilder; 0266 msgBuilder << file->title(); 0267 msgBuilder << QString::number(file->fileSize()) + QStringLiteral(" bytes"); 0268 const auto msg = msgBuilder.join(QLatin1StringView(", ")); 0269 ui.statusbar->showMessage(msg); 0270 }); 0271 } 0272 0273 #include "moc_mainwindow.cpp"