From da60739893748c8166b2f96c1570cd3a32970ef9 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 10 Jul 2018 23:51:07 +0300 Subject: [PATCH] Allow uploading many scans at once in passport. --- .../passport/passport_panel_controller.cpp | 16 ++++-- .../passport/passport_panel_edit_scans.cpp | 57 +++++++++++++------ .../passport/passport_panel_edit_scans.h | 3 +- 3 files changed, 53 insertions(+), 23 deletions(-) diff --git a/Telegram/SourceFiles/passport/passport_panel_controller.cpp b/Telegram/SourceFiles/passport/passport_panel_controller.cpp index da0c3f9b51..56b9ad1b81 100644 --- a/Telegram/SourceFiles/passport/passport_panel_controller.cpp +++ b/Telegram/SourceFiles/passport/passport_panel_controller.cpp @@ -945,20 +945,24 @@ void PanelController::editWithUpload(int index, int documentIndex) { Expects(documentIndex >= 0 && documentIndex < _scopes[index].documents.size()); + const auto &document = _scopes[index].documents[documentIndex]; + const auto requiresSpecialScan = document->requiresSpecialScan( + SpecialFile::FrontSide, + false); + const auto allowMany = !requiresSpecialScan; const auto widget = _panel->widget(); EditScans::ChooseScan(widget.get(), [=](QByteArray &&content) { - base::take(_scopeDocumentTypeBox); - editScope(index, documentIndex); - if (_scopes[index].documents[documentIndex]->requiresSpecialScan( - SpecialFile::FrontSide, - false)) { + if (!_editScope || !_editDocument) { + editScope(index, documentIndex); + } + if (requiresSpecialScan) { uploadSpecialScan(SpecialFile::FrontSide, std::move(content)); } else { uploadScan(std::move(content)); } }, [=](ReadScanError error) { readScanError(error); - }); + }, allowMany); } void PanelController::readScanError(ReadScanError error) { diff --git a/Telegram/SourceFiles/passport/passport_panel_edit_scans.cpp b/Telegram/SourceFiles/passport/passport_panel_edit_scans.cpp index 766e76b677..7321f44108 100644 --- a/Telegram/SourceFiles/passport/passport_panel_edit_scans.cpp +++ b/Telegram/SourceFiles/passport/passport_panel_edit_scans.cpp @@ -659,7 +659,7 @@ void EditScans::chooseScan() { _controller->uploadScan(std::move(content)); }, [=](ReadScanError error) { _controller->readScanError(error); - }); + }, true); } void EditScans::chooseSpecialScan(SpecialFile type) { @@ -667,24 +667,33 @@ void EditScans::chooseSpecialScan(SpecialFile type) { _controller->uploadSpecialScan(type, std::move(content)); }, [=](ReadScanError error) { _controller->readScanError(error); - }); + }, false); } void EditScans::ChooseScan( QPointer parent, Fn doneCallback, - Fn errorCallback) { + Fn errorCallback, + bool allowMany) { Expects(parent != nullptr); + const auto processFiles = std::make_shared>(); const auto filter = FileDialog::AllFilesFilter() + qsl(";;Image files (*") + cImgExtensions().join(qsl(" *")) + qsl(")"); const auto guardedCallback = crl::guard(parent, doneCallback); const auto guardedError = crl::guard(parent, errorCallback); - const auto onMainCallback = [=](QByteArray content) { - crl::on_main([=, bytes = std::move(content)]() mutable { + const auto onMainCallback = [=]( + QByteArray &&content, + QStringList &&remainingFiles) { + crl::on_main([ + =, + bytes = std::move(content), + remainingFiles = std::move(remainingFiles) + ]() mutable { guardedCallback(std::move(bytes)); + (*processFiles)(std::move(remainingFiles)); }); }; const auto onMainError = [=](ReadScanError error) { @@ -692,22 +701,38 @@ void EditScans::ChooseScan( guardedError(error); }); }; - const auto processImage = [=](QByteArray &&content) { - crl::async([=, bytes = std::move(content)]() mutable { + const auto processImage = [=]( + QByteArray &&content, + QStringList &&remainingFiles) { + crl::async([ + =, + bytes = std::move(content), + remainingFiles = std::move(remainingFiles) + ]() mutable { auto result = ProcessImage(std::move(bytes)); if (const auto error = base::get_if(&result)) { onMainError(*error); } else { auto content = base::get_if(&result); Assert(content != nullptr); - onMainCallback(std::move(*content)); + onMainCallback(std::move(*content), std::move(remainingFiles)); } }); }; - const auto processFile = [=](FileDialog::OpenResult &&result) { - if (result.paths.size() == 1) { + const auto processOpened = [=](FileDialog::OpenResult &&result) { + if (result.paths.size() > 0) { + (*processFiles)(std::move(result.paths)); + } else if (!result.remoteContent.isEmpty()) { + processImage(std::move(result.remoteContent), {}); + } + }; + *processFiles = [=](QStringList &&files) { + while (!files.isEmpty()) { + auto file = files.front(); + files.removeAt(0); + auto content = [&] { - QFile f(result.paths.front()); + QFile f(file); if (f.size() > App::kImageSizeLimit) { guardedError(ReadScanError::FileTooLarge); return QByteArray(); @@ -718,17 +743,17 @@ void EditScans::ChooseScan( return f.readAll(); }(); if (!content.isEmpty()) { - processImage(std::move(content)); + processImage(std::move(content), std::move(files)); + return; } - } else if (!result.remoteContent.isEmpty()) { - processImage(std::move(result.remoteContent)); } }; - FileDialog::GetOpenPath( + (allowMany ? FileDialog::GetOpenPaths : FileDialog::GetOpenPath)( parent, lang(lng_passport_choose_image), filter, - processFile); + processOpened, + nullptr); } rpl::producer EditScans::uploadButtonText() const { diff --git a/Telegram/SourceFiles/passport/passport_panel_edit_scans.h b/Telegram/SourceFiles/passport/passport_panel_edit_scans.h index 93895426f6..3dca978613 100644 --- a/Telegram/SourceFiles/passport/passport_panel_edit_scans.h +++ b/Telegram/SourceFiles/passport/passport_panel_edit_scans.h @@ -56,7 +56,8 @@ public: static void ChooseScan( QPointer parent, Fn doneCallback, - Fn errorCallback); + Fn errorCallback, + bool allowMany); ~EditScans();